From 9a63227f6b93b17d028388e1f30762efa07fc923 Mon Sep 17 00:00:00 2001 From: klauswitt Date: Mon, 10 Nov 2014 23:08:09 +0000 Subject: [PATCH] 51_RPI_GPIO: bugfixing restore on bootup, and gpio tool access git-svn-id: https://svn.fhem.de/fhem/trunk@6945 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/51_RPI_GPIO.pm | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/fhem/FHEM/51_RPI_GPIO.pm b/fhem/FHEM/51_RPI_GPIO.pm index 7986d37c8..2ce553a8c 100644 --- a/fhem/FHEM/51_RPI_GPIO.pm +++ b/fhem/FHEM/51_RPI_GPIO.pm @@ -103,6 +103,7 @@ sub RPI_GPIO_Define($$) { } unless( $counter ) { #abbrechen wenn export fehlgeschlagen Log3 $hash, 1, "$name: failed to export pin gpio$hash->{RPI_pin}"; + return "$name: failed to export pin gpio$hash->{RPI_pin}"; } $hash->{fhem}{interfaces} = "switch"; @@ -193,6 +194,12 @@ sub RPI_GPIO_State($$$$) { #reload readings at FHEM start } } elsif ( AttrVal($hash->{NAME},"direction","") eq "input") { if ($sname eq "Toggle") { + #wenn restoreOnStartup "on" oder "off" und der Wert mit dem im Statefile uebereinstimmt wird der Zeitstempel aus dem Statefile gesetzt + my $rval = AttrVal($hash->{NAME},"restoreOnStartup","last"); + $rval = "last" if ( $rval ne "on" && $rval ne "off" ); + $tim = gettimeofday() if $rval ne "last" && $rval ne $sval; + $sval = $rval eq "last" ? $sval : $rval; + $hash->{READINGS}{$sname}{VAL} = $sval; $hash->{READINGS}{$sname}{TIME} = $tim; Log3 $hash, 4, "INPUT $hash->{NAME}: $sname wiederhergestellt auf $sval"; @@ -204,10 +211,25 @@ sub RPI_GPIO_State($$$$) { #reload readings at FHEM start Log3 $hash, 4, "INPUT $hash->{NAME}: STATE wiederhergestellt auf $sval"; } } elsif ($sname eq "Counter") { - $hash->{READINGS}{$sname}{VAL} = $sval; - $hash->{READINGS}{$sname}{TIME} = $tim; - Log3 $hash, 4, "INPUT $hash->{NAME}: $sname wiederhergestellt auf $sval"; - } + $hash->{READINGS}{$sname}{VAL} = $sval; + $hash->{READINGS}{$sname}{TIME} = $tim; + Log3 $hash, 4, "INPUT $hash->{NAME}: $sname wiederhergestellt auf $sval"; + } elsif ( ($sname eq "state") && (AttrVal($hash->{NAME},"toggletostate","") ne "yes") ) { + #my $rval = AttrVal($hash->{NAME},"restoreOnStartup",""); + #if ($rval eq "" && (AttrVal($hash->{NAME},"toggletostate","") ne "yes") ) { + Log3 $hash, 4, "INPUT $hash->{NAME}: alter Pinwert war: $sval"; + my $val = RPI_GPIO_fileaccess($hash, "value"); + $val = $val eq "1" ? "on" :"off"; + Log3 $hash, 4, "INPUT $hash->{NAME}: aktueller Pinwert ist: $val"; + if ($val ne $sval) { + Log3 $hash, 4, "INPUT $hash->{NAME}: Pinwerte ungleich...Timer gesetzt"; + InternalTimer(gettimeofday() + (10), 'RPI_GPIO_Poll', $hash, 0); + } else { + $hash->{READINGS}{$sname}{VAL} = $sval; + $hash->{READINGS}{$sname}{TIME} = $tim; + } + #} + } } } return; @@ -537,6 +559,7 @@ sub RPI_GPIO_exuexpin($$) { #export, unexport and direction Pin via GPIO utili $dir = ""; } else { $sw = "export"; + $dir = "out" if ( $dir eq "high" || $dir eq "low" ); #auf out zurueck, da gpio tool dies nicht unterstützt $dir = " ".$dir; } if ( defined(my $ret = RPI_GPIO_CHECK_GPIO_UTIL($gpioprg)) ) {