Hallo Freunde,
ich bräuchte mal wieder Hilfe.
Ich möchte gerne in der Datei 99_myUtils.pm den Status eines GPIO Ports abfragen.
Leider habe ich mit der Symtax meine liebe Mühe. Meine Abfrage schaut im Moment wie folgt aus:
if {([GPIO_4] eq "open")} {
($f1 =0);
}
else {
($f1=1);
}
Ich habe schon unzählige Varianten ausprobiert, bekomme aber immer die folgende Fehlermeldung:
Syntax error at ./FHEM/99_myUtils.pm line 35, near "if {" syntax error at ./FHEM/99_myUtils.pm line 38, near "else" syntax error at ./FHEM/99_myUtils.pm line 56, near "}"
Hat jemand eine Idee was ich falsch mache.
Grüße
Kurt
Ist GPIO_4 ein Device ?
JA,
ich habe es wie folgt definiert:
Define GPIO_4 RPI_GPIO 4
Wenn Du in Perl auf die Readings eines Device zugreifen möchtest, dann geht das mit ReadingsVal oder Value. Wegen der genauen Syntax möchte ich Dich bitten in der Commandref unter Perl Specials nach zu sehen.
Der gemeldete Fehler liegt in der Nähe von if {, da möchte ich Dich bitten Dir die Syntax von if-Anweisungen in einem Perl Tutorial an zu schauen.
http://fhem.de/commandref_DE.html#perl (http://fhem.de/commandref_DE.html#perl)
http://perl-6.de/tutorials/anfaenger/if-anweisung (http://perl-6.de/tutorials/anfaenger/if-anweisung)
Ich habe das Problem inzwischen gelöst. Das schwierige ist nicht die IF Abfrage, sondern den Status des GPIO Eingangs zu lesen.
Die Abfrage von GPIO Eingänge ist etwas komplex. Die Daten der GPIO Eingänge werden alle in "Hashes" abgespeichert und können von dort abgerufen warden.
Ein Hash ist ein Array, welches mit Strings indiziert wird.
Der Aufruf erfolgt dann wie folgt:
$a=($defs{GPIO_4}{READINGS}{Pinlevel}{VAL});
Damit wird der Wert des Pinlevels (high oder low) des GPIO_4 an die Variable $a übergeben.
Damit kann dann ganz einfach die folgende Abfrage gemacht werden:
if ($a eq "high") {
($f1 =1); }
else {
($f1=0);
}
Leider gibt es dazu keinerlei vernünftige Literatur, weshalb ich das alles empirisch ermitteln musste. So komme täglich in ganz kleinen Schritten voran.
Na ja, die Fehlermeldung im 1. Beitrag deutet schon auf ein Unverständnis zur Syntax des if.
Die eigentliche Frage hast Du explizit gar nicht gestellt, nämlich: Wie greife ich in Perl auf Readings eines Devices zu?
Da gibt es vernünftige Literatur, die Commandref und dort steht :
ZitatReadingsVal(<devicename>,<reading>,<defaultvalue>)
Gibt den Inhalt der "readings" zurück (den Inhalt der in dem "Readings"-Abschnitt von "list device" angezeigt wird)
In Deinem Fall ReadingsVal("GPIO_4","Pinlevel","DeinDefault")
Zu Deiner Lösung über die Hashes steht was im Wiki: http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#Readings
Alles beschrieben schon in vernünftiger Literatur beschrieben.