Hauptmenü

DOIF- Perl-Modus Logikfrage

Begonnen von chq, 23 Oktober 2018, 08:43:31

Vorheriges Thema - Nächstes Thema

chq

Hallo,

ich habe ein Problem im Rahmen eines Perl-Modus-DOIFs lösen können, verstehe jedoch nicht, warum es beim ersten Anlauf nicht geklappt hat.

Es geht darum, dass das Reading "doifState" unmittelbar auf "running" gesetzt wird, sobald jmd. den Rolladenaktor händisch bedient ([HM_rolloEsszimmer:""]) und der Rolladen geschlossen ist ([?HM_rolloEsszimmer:state] eq "closed"). Erst 42 Sekunden später soll "doifState" dann mit "idle" beschrieben werden.

In der ersten Version wird "doifState" sofort mit "sonnenstDisabled" beschrieben, was nicht gewünscht ist. Meiner Meinung nach dürfte "doifState" jedoch erst dann mit "sonnenstDisabled" beschrieben werden, wenn (set_Exec("fhemCmdTimer",42,'set_Reading("doifState","idle")') abgelaufen ist. Dies ist jedoch nicht der Fall; aber warum?

Erste (nicht funktionierende) Version:

{if([HM_rolloEsszimmer:""] and [?HM_rolloEsszimmer:state] eq "closed")
{set_Reading("doifState","running");
set_Exec("fhemCmdTimer",42,'set_Reading("doifState","idle")')}}

{if([HM_rolloEsszimmer:""] and get_Reading("doifState") eq "idle") {set_Reading("doifState","sonnenstDisabled");
fhem_set("doif_sonnenstand disable")}}


Zweite (funktionierende) Version:

{if([HM_rolloEsszimmer:""] and [?HM_rolloEsszimmer:state] eq "closed")
{set_Reading("doifState","running"); set_Exec("fhemCmdTimer",42,'set_Reading("doifState","idle")')}
elsif([HM_rolloEsszimmer:""] and get_Reading("doifState") eq "idle" and [?HM_rolloEsszimmer:state] ne "closed") {set_Reading("doifState","sonnenstDisabled");
fhem_set("doif_sonnenstand disable")}}


Vielleicht kann mich jmd. aufklären.  ::)

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Damian

Bei mir funktioniert auch die erste Version, wie erwartet.

Um den tatsächlichen Zustand in FHEMWEB zu sehen, musst du den Zustand des Browsers aktualisieren. set_Reading erzeugt per Default keine Events.

getestet mit:

{if([FS])
{set_Reading("doifState","running");
set_Exec("fhemCmdTimer",5,'set_Reading("doifState","idle")')}}

{if([FS] and get_Reading("doifState") eq "idle") {set_Reading("doifState","sonnenstDisabled");
fhem_set("doif_sonnenstand disable")}}


FS ist bei mir eine Fernbedienung.

Wahrscheinlich  ist [?HM_rolloEsszimmer:state] eq "closed" zum Zeitpunkt der Abfrage nicht wahr - HM arbeitet mit Zwischenzuständen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chq

Hm- merkwürdig. Dann muss ich es vermutlich noch einmal ausprobieren.

Danke für Deinen Test! :)

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

chq

#3
Ich habe festgestellt, dass auch die zweite Variante (s.o.) von mir nicht das gewünschte Ergebnis erzielt.
Bei beiden Varianten wird "doifState" sofort (und nicht erst nach 42 Sekunden) mit "sonnenstDisabled" beschrieben und nicht mit "running".

Testbedingungen:

HM_rolloEsszimmer ist geschlossen
Perl-Modus-DOIF "doifState" steht auf "idle"

Nun wird der Taster am Rolladenaktor händisch bedient.

Im Eventmonitor erscheint Folgendes:

2018-10-25 07:15:28 DOIF doif_sonnenstand last_cmd: idle
2018-10-25 07:15:28 DOIF doif_sonnenstand disabled
2018-10-25 07:15:28 DOIF doif_sonnenstand mode: disabled
2018-10-25 07:15:28 HMCCUDEV HM_rolloEsszimmer 1.WORKING: yes
2018-10-25 07:15:28 HMCCUDEV HM_rolloEsszimmer 1.DIRECTION: up
2018-10-25 07:15:28 HMCCUDEV HM_rolloEsszimmer 1.LEVEL: 6.5
2018-10-25 07:15:28 HMCCUDEV HM_rolloEsszimmer control: 6.5
2018-10-25 07:15:28 HMCCUDEV HM_rolloEsszimmer 6.5
2018-10-25 07:15:28 HMCCUDEV HM_rolloEsszimmer hmstate: 6.5
2018-10-25 07:15:37 HMCCURPCPROC d_rpcHmIP_RF No events from interface CB2010000014 for 600 seconds
2018-10-25 07:16:07 HMCCUDEV HM_rolloEsszimmer 1.WORKING: no
2018-10-25 07:16:07 HMCCUDEV HM_rolloEsszimmer 1.LEVEL: open
2018-10-25 07:16:07 HMCCUDEV HM_rolloEsszimmer control: 100
2018-10-25 07:16:07 HMCCUDEV HM_rolloEsszimmer open
2018-10-25 07:16:07 HMCCUDEV HM_rolloEsszimmer 1.DIRECTION: none
2018-10-25 07:16:07 HMCCUDEV HM_rolloEsszimmer hmstate: open


Ich habe die 6.5 bei den Events durchaus gesehen. HM_rolloEsszimmer war zum Zeitpunkt der Bedienung jedoch garantiert geschlossen und dies wurde mir bei den HMCCUDEVs auch mit "closed" richtig angezeigt.

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Damian

solche Abfragen sind eigentlich nicht sinnvoll

{if([HM_rolloEsszimmer:""] and [?HM_rolloEsszimmer:state] eq "closed") ...

eher:

{if([HM_rolloEsszimmer:state] eq "closed") ...

Die Abfrage selbst ist doch gleichzeitig auch der Trigger.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chq

#5
Ich möchte aber nicht, dass etwas passiert sobald der Rolladen geschlossen ist, sondern dass etwas passiert wenn der Rolladen bereits geschlossen ist und dann ein beliebiges Event des selben Rolladenaktors erzeugt wird.

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Damian

Zitat von: chq am 25 Oktober 2018, 13:21:46
Ich möchte aber nicht, dass etwas passiert sobald der Rolladen geschlossen ist, sondern dass etwas passiert wenn der Rolladen bereits geschlossen ist und dann ein beliebiges Event des selben Rolladenaktors erzeugt wird.

Gruß Chris

Beide Abfragen bedeuten aber das Selbe, denn zum Zeitpunkt des Events ist bereits der neue Zustand gesetzt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chq

Mit "neue Zustand gesetzt" meinst Du eben beispielsweise den besagten Wert 6.5 von meinem vorletzten Posting, was wie von Dir bereits hier erwähnt zu meinem Problem führen könnte? Sprich, das "closed" ist da bereits schon Vergangenheit.

Zitat von: Damian am 23 Oktober 2018, 09:55:14Wahrscheinlich  ist [?HM_rolloEsszimmer:state] eq "closed" zum Zeitpunkt der Abfrage nicht wahr - HM arbeitet mit Zwischenzuständen.

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Damian

Zitat von: chq am 25 Oktober 2018, 20:28:03
Mit "neue Zustand gesetzt" meinst Du eben beispielsweise den besagten Wert 6.5 von meinem vorletzten Posting, was wie von Dir bereits hier erwähnt zu meinem Problem führen könnte? Sprich, das "closed" ist da bereits schon Vergangenheit.

Gruß Chris

Teste mit:

if([HM_rolloEsszimmer:state] eq "closed")

und nicht mit:

if([HM_rolloEsszimmer:""] and [?HM_rolloEsszimmer:state] eq "closed")

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF