Hi,
Kurzfassung: warum springt folgender Code immer in das "else"?
Schalter1_links:off { if (ReadingsVal("Rolladen","parsestate","") ne "up") { fhem("set Rolladen up") } else { fhem("set Rolladen stop") } }
Längere Fassung:
Ich versuche gerade einen Taster zu belegen um meinen Rolladen zu steuern. Eigentlich ganz einfach:
- Drückt man die obere Taste, soll er hoch fahren
- Drückt man die untere Taste soll er runter fahren
- Bewegt er sich und drückt man eine der Tasten, soll er anhalten.
Die ersten Zwei Anforderungen sind trivial, doch gerade die letzte bereitet mir Kopfzerbrechen.
In den Readings hat der Rolladen zum einen "state" und auch "parsestate". Letzteres sagt im Grunde etwas über die aktuelle Bewegungsrichtung aus.
Stati für "state":
Zitatopen
10
...
80
90
down
closed
Stati für "parsestate":
Zitatoff
up
stop
down
closed
Mein Ansatz war per ReadingsVal auf den parsestate zu schauen ob/wohin der Rolladen sich bewegt und entsprechend den Befehl zu senden. Doch landet dieser Code lediglich immer im "else"
Schalter1_links:off { if (ReadingsVal("Rolladen","parsestate","") ne "up") { fhem("set Rolladen up") } else { fhem("set Rolladen stop") } }
Interessanterweise funktioniert eine Abwandlung des Codes besser... wenn auch noch nicht richtig. Beispielsweise wenn der Rolladen "closed" ist, muss man zwei mal drücken. Das erste mal geht er in "stop" und anschließend in "up".
Schalter1_links:off { if (ReadingsVal("Rolladen","parsestate","") eq "stop") { fhem("set Rolladen up") } else { fhem("set Rolladen stop") } }
Von der Logik her bilde ich mir ein, dass mein erster Ansatz eindeutiger ist, doch scheinen FHEM und ich nicht auf der gleichen Wellenlänge zu schwingen. Wer kann mir helfen? ;)
Entscheidend für die Funktion ist der Wert von parsestate wenn das notify auslöst. Hat parsestate dann den von Dir erwarteten Wert?
Was bekommst Du zurück wenn Du das {ReadingsVal("Rolladen","parsestate","")}
in die Kommandozeile eingibst?.
Gruß Otto
warum eigentlich immer raus in Perl? gerade beim Befehl am Ende erscheint mir das seltsam.
Oder hat das einen besonderen Grund? sieht man irgendwie recht oft.
Man kann doch readings auch direkt abfragen und Befehle absetzen.
Zitat von: Frank_Huber am 15 März 2017, 12:22:15
warum eigentlich immer raus in Perl? gerade beim Befehl am Ende erscheint mir das seltsam.
Oder hat das einen besonderen Grund? sieht man irgendwie recht oft.
Man kann doch readings auch direkt abfragen und Befehle absetzen.
if und else ist nun mal Perl. Da musst Du am Ende wieder "rein" zu FHEM.
Alternativ IF und ELSE bei dem notify sicher einfacher, da bleibt man durchgängig in FHEM.
-> https://fhem.de/commandref_DE.html#IF
Gruß Otto
Zitat von: Frank_Huber am 15 März 2017, 12:22:15
warum eigentlich immer raus in Perl? gerade beim Befehl am Ende erscheint mir das seltsam.
Oder hat das einen besonderen Grund? sieht man irgendwie recht oft.
Man kann doch readings auch direkt abfragen und Befehle absetzen.
Du fragst aber nicht einfach ein Reading ab sondern hast eine Bedingung die Du abfragst. Bedingungen gehen ohne Perl nur mit dem FHEM Befehl IF oder mit dem Modul DOIF.
Zitat von: Otto123 am 15 März 2017, 12:16:23
Was bekommst Du zurück wenn Du das {ReadingsVal("Rolladen","parsestate","")}
in die Kommandozeile eingibst?.
Gruß Otto
Es liefert "Off"... Warum auch immer :o
Edit: scheint wohl eine Statusmeldung zu sein, wenn der Rolladen ganz hoch gefahren ist. Aber es erklärt mir immer noch nicht, warum mein "ne" nicht funktioniert....
Edit 2: das parsestate zeigt "on", wenn der Rolladen nicht offen ist und "off" wenn er gänzlich geöffnet ist. Allerdings gibt die o.g. Abfrage nie "up" oder "down" zurück. Merkwürdigerweise sehe ich es in FHEM so, während der Rolladen sich bewegt. Lade ich aber die Seite neu, taucht dort auch nur noch "on" bzw. "off" auf.
Zitat von: CoolTux am 15 März 2017, 12:28:12
Du fragst aber nicht einfach ein Reading ab sondern hast eine Bedingung die Du abfragst. Bedingungen gehen ohne Perl nur mit dem FHEM Befehl IF oder mit dem Modul DOIF.
Ah, daher weht der Wind. und deshalb dann auch der Befehl von Perl zurück ins fhem.
wäre hier der DOIF nicht der einfachere Weg?
Zitat von: Frank_Huber am 15 März 2017, 12:49:00
Ah, daher weht der Wind. und deshalb dann auch der Befehl von Perl zurück ins fhem.
wäre hier der DOIF nicht der einfachere Weg?
Ansichtssache würde ich sagen. Ich verwende zwar auch DOIF aber in sehr sehr geringen Mengen. Für mich ist ein Watchdog oder Notify aussagekräftiger.
Zitat von: CoolTux am 15 März 2017, 12:59:36
Ansichtssache würde ich sagen. Ich verwende zwar auch DOIF aber in sehr sehr geringen Mengen. Für mich ist ein Watchdog oder Notify aussagekräftiger.
Jetzt hab ich gradmal gelernt mit DOIF umzugehen kommst Du mit Watchdog daher. *lach*
grad mal die Commandref gelesen, sehr interessantes Modul! kann ich bestimmt bischen was umbauen. ;)
Zitat von: Frank_Huber am 15 März 2017, 13:18:00
Jetzt hab ich gradmal gelernt mit DOIF umzugehen kommst Du mit Watchdog daher. *lach*
grad mal die Commandref gelesen, sehr interessantes Modul! kann ich bestimmt bischen was umbauen. ;)
DOIF macht im Grunde das selbe wie Notify at und Watchdog. Einfach das nehmen womit man besser klar kommt.
Zitat von: CoolTux am 15 März 2017, 13:31:36
DOIF macht im Grunde das selbe wie Notify at und Watchdog. Einfach das nehmen womit man besser klar kommt.
Watchdog schaut doch etwas anderst aus mit seinen zwei Bedingungen und der Zeit dazwischen. Muss ich mir auf jeden Fall in ner ruhigen Minute mal anschauen.
momentan läuft alles was ich brauche per DOIF und at. FHEM kann so viel..... denk ich hab da noch einiges was ich mit der Zeit lernen / optimieren kann. ;)
@Reingold BTW "Off" wäre ne "off" ;) Dann ist Dein parsestate offenbar nur ein transienter Wert, müsste ja aber trotzdem funktionieren, während er sich bewegt.
Gruß Otto
@Otto: das ist ja das was mich verwundert... "off" != "up" aber dennoch bewegt sich nichts. Die Abfrage springt immer in das Else rein.
findest im Event-Monitor eventuell den richtigen Status?
weil da hast doch alle Events die in fhem ankommen drin stehen...
Zitat von: Rheingold am 15 März 2017, 15:47:43
"off" != "up"
Diese Aussage ist schlichtweg falsch!
Richtig wäre:
"off" ne "up"
8) 8) 8)
Gruß
Dan
Im Perl-Syntax hast du wohl recht :D
Der Eventmonitor sagt folgendes wenn der Rolladen von ganz geöffnet zu vollständig geschlossen fährt:
Zitat2017-03-15 15:56:43 SOMFY Rolladen parsestate: down
2017-03-15 15:56:45 SOMFY Rolladen 10
2017-03-15 15:56:45 SOMFY Rolladen position: 10
2017-03-15 15:56:45 SOMFY Rolladen exact: 14.2857142857143
2017-03-15 15:56:48 SOMFY Rolladen 30
2017-03-15 15:56:48 SOMFY Rolladen position: 30
2017-03-15 15:56:48 SOMFY Rolladen exact: 28.5238095238095
2017-03-15 15:56:51 SOMFY Rolladen 40
2017-03-15 15:56:51 SOMFY Rolladen position: 40
2017-03-15 15:56:51 SOMFY Rolladen exact: 42.7619047619048
2017-03-15 15:56:54 SOMFY Rolladen 60
2017-03-15 15:56:54 SOMFY Rolladen position: 60
2017-03-15 15:56:54 SOMFY Rolladen exact: 57
2017-03-15 15:56:57 SOMFY Rolladen 70
2017-03-15 15:56:57 SOMFY Rolladen position: 70
2017-03-15 15:56:57 SOMFY Rolladen exact: 71.2380952380952
2017-03-15 15:57:00 SOMFY Rolladen 90
2017-03-15 15:57:00 SOMFY Rolladen position: 90
2017-03-15 15:57:00 SOMFY Rolladen exact: 85.4761904761905
2017-03-15 15:57:03 SOMFY Rolladen 100
2017-03-15 15:57:03 SOMFY Rolladen position: 100
2017-03-15 15:57:03 SOMFY Rolladen exact: 99.7142857142857
2017-03-15 15:57:06 SOMFY Rolladen closed
2017-03-15 15:57:06 SOMFY Rolladen position: 200
2017-03-15 15:57:06 SOMFY Rolladen exact: 200
Irgendwie verwirrend, da der parsestate wohl gesetzt wird :o
@Rheingold: parsestate wird eigentlich nur gesetzt, wenn ein Kommando an den Rolladen über die Parse-Funktion (also als empfangener Funkbefehl) hereinkommt. Deshalb ist bei den Events auch nur am Anfang ein Eintrag, der dem Funkbefehl für runter entspricht. Verschiedene Stati sieht man da, wenn man einen Positionsbefehl angibt "set ... pos 50" dann wird erst eine Bewegung ausgelöst (down oder up) und dann irgendwann der Stoppbefehl gesendet (stop). Hilft hier also eigentlich nicht.
Oder in Kürze, wenn Du auf die Position des Rolladen reagieren willst verwende state oder position. Wenn Du erkennen willst, ob der Rolladen gerade in Bewegung ist und my-pos verwendet wird, dann könnte möglicherweise das internal "move" helfen. Da du ja nicht auf ein Event vom Rolladen reagierst ist also auch das Eventverhalten von internals (sprich keine events) irrelevant.
Also so etwas wie
Schalter1_links:off { if (InternalVal("Rolladen","move","") ne "off") { fhem("set Rolladen up") } else { fhem("set Rolladen stop") } }
Wobei ich das hier gerade nicht ausprobieren kann
Danke für den Tipp. Ich habe es mit dem parsestate gelöst.
Und zwar stellte ich fest, dass wenn der Rolladen in einer aufwärts-Bewegung war, der parsestate immer auf "off" stand. Bei einer Abwärtsbewegung auf "on". In Folge dessen sind die beiden (schöner formatierten) Befehle entstanden die derzeit funktionieren
Schalter1_links:off IF (ReadingsVal("Rolladen","parsestate","") ne "off") (set Rolladen up) ELSE (set Rolladen stop)
Schalter1_links:on IF (ReadingsVal("Rolladen","parsestate","") ne "on") (set Rolladen down) ELSE (set Rolladen stop)
Danke für die Hilfe, Gedankenanstöße und interessanten Diskussionen (aka off-topic :D) ;)
Schön das es funktioniert, allerdings ist anzumerken, dass diese Werte vermutlich nicht stimmen, wenn Du auch andere manuelle Fernbedienungen hast und ausserdem gerade ein grösserer Umbau in Vorbereitung bei dem auch parsestate nicht weiter verwendet wird.
Oh, guter Hinweis. Wenn der Wert bald nicht mehr geliefert wird, macht es natürlich Sinn jetzt schon die bessere Lösung zu suchen.
Schalter1_links:off IF (InternalVal("Rolladen","move","") ne "off") (set Rolladen up) ELSE (set Rolladen stop)
Schalter1_links:on IF (InternalVal("Rolladen","move","") ne "on") (set Rolladen down) ELSE (set Rolladen stop)
Funktioniert :) Danke.
Hi zusammen,
wenn ich mir das hier so durch lese, sieht es aus wie eine Abwandlung von der DOIF Variante hier:
define rollo_manuell_ab DOIF ([ESPEasy_az_rollo:strom_output_runter] eq "on" and [az_rollo] ne "drive-down") (set az_rollo extern closed) DOELSEIF ([ESPEasy_az_rollo:strom_output_runter] eq "off" and [az_rollo] eq "drive-down") (set az_rollo extern stop)
define rollo_manuell_auf DOIF ([ESPEasy_az_rollo:strom_output_hoch] eq "on" and [az_rollo] ne "drive-up") (set az_rollo extern open) DOELSEIF ([ESPEasy_az_rollo:strom_output_hoch] eq "off" and [az_rollo] eq "drive-up") (set az_rollo extern stop)
Da ich noch in der Lernphase bin, würde mich interessieren, ob ich hier richtig liege....
Zitat von: 87insane am 30 Juli 2018, 13:00:11
Hi zusammen,
wenn ich mir das hier so durch lese, sieht es aus wie eine Abwandlung von der DOIF Variante hier:
define rollo_manuell_ab DOIF ([ESPEasy_az_rollo:strom_output_runter] eq "on" and [az_rollo] ne "drive-down") (set az_rollo extern closed) DOELSEIF ([ESPEasy_az_rollo:strom_output_runter] eq "off" and [az_rollo] eq "drive-down") (set az_rollo extern stop)
define rollo_manuell_auf DOIF ([ESPEasy_az_rollo:strom_output_hoch] eq "on" and [az_rollo] ne "drive-up") (set az_rollo extern open) DOELSEIF ([ESPEasy_az_rollo:strom_output_hoch] eq "off" and [az_rollo] eq "drive-up") (set az_rollo extern stop)
Da ich noch in der Lernphase bin, würde mich interessieren, ob ich hier richtig liege....
Da der Modulentwickler sowohl des Moduls IF als auch des Moduls DOIF der selbe ist stehen die Chancen hoch das die Syntax ähnlich ist.