From c07f757c4a3c0dc5fee0b1f022cffe08503ad3ab Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sat, 11 Jun 2022 14:07:16 +0200 Subject: [PATCH] [alpha] - implementation extend state with one more thing... --- CHANGED | 2 +- FHEM/74_GardenaSmartDevice.pm | 155 +++++++++++++++++--------------- controls_GardenaSmartDevice.txt | 2 +- 3 files changed, 83 insertions(+), 76 deletions(-) diff --git a/CHANGED b/CHANGED index 1977e18..5abc55f 100644 --- a/CHANGED +++ b/CHANGED @@ -1 +1 @@ - cleanup code + fix boolean diff --git a/FHEM/74_GardenaSmartDevice.pm b/FHEM/74_GardenaSmartDevice.pm index 0b080f5..3afc6cb 100644 --- a/FHEM/74_GardenaSmartDevice.pm +++ b/FHEM/74_GardenaSmartDevice.pm @@ -166,7 +166,7 @@ sub Initialize { $hash->{AttrList} = "readingValueLanguage:de,en " . "model:watering_computer,sensor,sensor2,mower,ic24,power,electronic_pressure_pump " - . "extendedState " + . "extendedState:0,1 " . "IODev " . $readingFnAttributes; $hash->{parseParams} = 1; @@ -869,89 +869,96 @@ sub setState { if ( AttrVal( $name, 'model', 'unknown' ) eq 'mower' ); # ic24 - readingsBulkUpdate( - $hash, 'state', - 'scheduled watering next start: ' - . ( - ReadingsVal( - $name, 'scheduling-scheduled_watering_next_start', - 'no timer' - ) - ) - ) if ( AttrVal( $name, 'model', 'unknown' ) eq 'ic24' ); + if ( AttrVal( $name, 'model', 'unknown' ) eq 'ic24' ){ + my @ic24opened_ventils; + my $state_string = ''; my $nearst_irrigation = '2999-12-12 24:00'; + my $has_scheduling = 0; my $lowest_duration = 9999; + my @valves_connected = split(',', ReadingsVal( $name, 'ic24-valves_connected', '')); + for (@valves_connected){ + ## add to opened ventils, if watering active + push @ic24opened_ventils, $_ if ( ( ( ReadingsVal( $name, "watering-watering_timer_".$_."_duration", 0 ) =~ m{\A[1-9]([0-9]+)?\z}xms ) ? $_ : 0 ) > 0 ); + ## find nearst timestamp + $has_scheduling = 1 if ( ReadingsVal($name, 'scheduling-schedules_paused_until_'.$_ , '') ne '2038-01-18T00:00:00.000Z'); + $lowest_duration = ReadingsVal( $name, "watering-watering_timer_".$_."_duration", 0 ) if ( + ( ReadingsVal( $name, "watering-watering_timer_".$_."_duration", 0 ) =~ m{\A[1-9]([0-9]+)?\z}xms + && ReadingsVal( $name, "watering-watering_timer_".$_."_duration", 0 ) > 0 + && ReadingsVal( $name, "watering-watering_timer_".$_."_duration", 0 ) < $lowest_duration ) ); - # override state 4 extendedstates - if ( AttrVal( $name, "extendedState", 0 ) == 1) { - ### ic24 - if ( AttrVal( $name, 'model', 'unknown' ) eq 'ic24' ){ - my @ic24opened_ventils; - my $state_string = ''; my $nearst_irrigation = '2999-12-12 24:00'; - my $has_scheduling = 0; - my @valves_connected = split(',', ReadingsVal( $name, 'ic24-valves_connected', '')); - for (@valves_connected){ - ## add to opened ventils, if watering active - push @ic24opened_ventils, $_ if ( ( ( ReadingsVal( $name, "watering-watering_timer_".$_."_duration", 0 ) =~ m{\A[1-9]([0-9]+)?\z}xms ) ? $_ : 0 ) > 0 ); - ## find nearst timestamp - $has_scheduling = 1 if ( ReadingsVal($name, 'scheduling-schedules_paused_until_'.$_ , '') ne '2038-01-18T00:00:00.000Z'); - - if ( ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$_, '') ne '') { - $nearst_irrigation = ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$_, '') if ( Time::Piece->strptime( ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$_, ''), "%Y-%m-%d %H:%M") < Time::Piece->strptime( $nearst_irrigation, "%Y-%m-%d %H:%M")) - } # fi - } + if ( ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$_, '') ne '') { + $nearst_irrigation = ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$_, '') if ( Time::Piece->strptime( ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$_, ''), "%Y-%m-%d %H:%M") < Time::Piece->strptime( $nearst_irrigation, "%Y-%m-%d %H:%M")) + } # fi + } + # override state 4 extendedstates + if ( AttrVal( $name, "extendedState", 0 ) == 1) { if (scalar(@ic24opened_ventils) > 0){ - $state_string .= sprintf(RigReadingsValue($hash,'valve').' '.$_.' '.(RigReadingsValue($hash, 'will be irrigated %.f minutes remaining.')), (ReadingsVal( $name, 'watering-watering_timer_'.$_.'_duration', 0 )/60)); + ## valve 1 will be ir.. 23 minutes remaining + for (@valves_connected){ + $state_string .= sprintf(RigReadingsValue($hash,'valve').' '.$_.' '.(RigReadingsValue($hash, 'will be irrigated %.f minutes remaining.') .'
'), (ReadingsVal( $name, 'watering-watering_timer_'.$_.'_duration', 0 )/60)); + } # /for } else { $state_string .= RigReadingsValue($hash, 'closed'); } $state_string .= ($has_scheduling) ? sprintf( RigReadingsValue($hash, 'next watering: %s'), RigReadingsValue($hash, ReadingsVal($name, 'scheduling-scheduled_watering_next_start', ''))) : sprintf( RigReadingsValue($hash, 'paused until %s') , $nearst_irrigation); - - #TODO: Write state format for ventil 1-@valces_connected -> map ? + } else { + $state_string = scalar(@ic24opened_ventils) > 0 ? + # offen + ? sprintf( (RigReadingsValue($hash, 'will be irrigated %.f minutes remaining.')), $lowest_duration/60); + # zu + : + ( $has_scheduling ) + # zeitplan aktiv + ? sprintf( (RigReadingsValue($hash, 'closed') .'. '.RigReadingsValue($hash, 'next watering: %s')), $nearst_irrigation ) + # zeitplan pausiert + : RigReadingsValue($hash, 'closed') + ; + # state offline | override + $state_string = 'offline' if ($online_state eq 'offline'); - ## check ob ws offen ist - # ja -> dann zeig alle offene an ( durch api max. 2 ) - ## - # nein -> dann nur closed - # - ## check ob ein zeitplan aktiv - # ja -> zeig nur den nächsten an - ## - # nein -> permanent geschlosen - #### - # ### eventuell auf binare bits und shiften - # $state_string .= $activ_watering > 0 - # # offen - # ? - # ( ReadingsVal($name, 'scheduling-schedules_paused_until_'.$activ_watering, '' ) eq '' ) - # # leer ( zeitplan aktiv ... ) - # ? sprintf('V'.$activ_watering.' '.(RigReadingsValue($hash, 'will be irrigated %.f minutes remaining.').' '.RigReadingsValue($hash, 'next watering: %s')), (ReadingsVal( $name, 'watering-watering_timer_'.$activ_watering.'_duration', 0 )/60), RigReadingsValue($hash, ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$activ_watering, '')) ) - # # zeitplan pausiert - # : - # ( ReadingsVal($name, 'scheduling-schedules_paused_until_'.$activ_watering , '') eq '2038-01-18T00:00:00.000Z') - # # pause bis dauerhaft - # ? sprintf('V'.$activ_watering.' '. (RigReadingsValue($hash, 'will be irrigated %.f minutes remaining.').' '.RigReadingsValue($hash , 'schedule permanently paused')), (ReadingsVal( $name, 'watering-watering_timer_'.$activ_watering.'_duration', 0 )/60) ) - # # naechter termin - # : sprintf('V'.$activ_watering.' '. RigReadingsValue($hash , 'paused until %s'), RigReadingsValue($hash, ReadingsVal($name, 'scheduling-schedules_paused_until_'.$activ_watering , '')) ) - # # zu - # : - # ( ReadingsVal($name, 'scheduling-schedules_paused_until_'.$activ_watering , '' ) eq '' ) - # # zeitplan aktiv - # ? sprintf( (RigReadingsValue($hash, 'closed') .'. '.RigReadingsValue($hash, 'next watering: %s')), RigReadingsValue($hash, ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$activ_watering, '') ) ) - # # zeitplan pausiert - # : RigReadingsValue($hash, 'closed') - # ; - - #} FOR valvces_connected - # if ($activ_watering > 0) - # { - # # ein ventil offen - # my $state_string = "ein ventil offen" - - # } - readingsBulkUpdate( - $hash, 'state', RigReadingsValue( $hash, $state_string ) ); } + + ## check ob ws offen ist + # ja -> dann zeig alle offene an ( durch api max. 2 ) + ## + # nein -> dann nur closed + # + ## check ob ein zeitplan aktiv + # ja -> zeig nur den nächsten an + ## + # nein -> permanent geschlosen + #### + # ### eventuell auf binare bits und shiften + # $state_string .= $activ_watering > 0 + # # offen + # ? + # ( ReadingsVal($name, 'scheduling-schedules_paused_until_'.$activ_watering, '' ) eq '' ) + # # leer ( zeitplan aktiv ... ) + # ? sprintf('V'.$activ_watering.' '.(RigReadingsValue($hash, 'will be irrigated %.f minutes remaining.').' '.RigReadingsValue($hash, 'next watering: %s')), (ReadingsVal( $name, 'watering-watering_timer_'.$activ_watering.'_duration', 0 )/60), RigReadingsValue($hash, ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$activ_watering, '')) ) + # # zeitplan pausiert + # : + # ( ReadingsVal($name, 'scheduling-schedules_paused_until_'.$activ_watering , '') eq '2038-01-18T00:00:00.000Z') + # # pause bis dauerhaft + # ? sprintf('V'.$activ_watering.' '. (RigReadingsValue($hash, 'will be irrigated %.f minutes remaining.').' '.RigReadingsValue($hash , 'schedule permanently paused')), (ReadingsVal( $name, 'watering-watering_timer_'.$activ_watering.'_duration', 0 )/60) ) + # # naechter termin + # : sprintf('V'.$activ_watering.' '. RigReadingsValue($hash , 'paused until %s'), RigReadingsValue($hash, ReadingsVal($name, 'scheduling-schedules_paused_until_'.$activ_watering , '')) ) + # # zu + # : + # ( ReadingsVal($name, 'scheduling-schedules_paused_until_'.$activ_watering , '' ) eq '' ) + # # zeitplan aktiv + # ? sprintf( (RigReadingsValue($hash, 'closed') .'. '.RigReadingsValue($hash, 'next watering: %s')), RigReadingsValue($hash, ReadingsVal($name, 'scheduling-scheduled_watering_next_start_'.$activ_watering, '') ) ) + # # zeitplan pausiert + # : RigReadingsValue($hash, 'closed') + # ; + + #} FOR valvces_connected + # if ($activ_watering > 0) + # { + # # ein ventil offen + # my $state_string = "ein ventil offen" + # } + readingsBulkUpdate( + $hash, 'state', RigReadingsValue( $hash, $state_string ) ); } #online state water control # zeitplan -> dauert pausiert wenn 2038-01-18T00:00:00.000Z diff --git a/controls_GardenaSmartDevice.txt b/controls_GardenaSmartDevice.txt index 10e6c25..990e2c4 100644 --- a/controls_GardenaSmartDevice.txt +++ b/controls_GardenaSmartDevice.txt @@ -1,2 +1,2 @@ UPD 2022-05-28_13:13:38 49520 FHEM/73_GardenaSmartBridge.pm -UPD 2022-06-10_20:26:59 66958 FHEM/74_GardenaSmartDevice.pm +UPD 2022-06-11_14:06:34 67705 FHEM/74_GardenaSmartDevice.pm