[DOIF] - DOELSEIF funktioniert nicht

Begonnen von drhirn, 10 Dezember 2015, 16:09:03

Vorheriges Thema - Nächstes Thema

drhirn

Hi,

ich hätte gerne, dass zwei Aktoren an-/ausgehen und der Status eines Schalters geändert wird, wenn entweder einer der Aktoren oder der Schalter seinen Status ändert.
Weil ich's nicht hinbekomme, habe ich mir Dummies gebaut, mit denen ich teste. Also nicht verwirren lassen.

Die Definition des DOIF:

([tswDesk01] eq "A0" or [tacPC01] eq "on")
(set tacPC01 on)
(set tacPC02 on)
(setreading tswDesk01 channelA A0)
(set tswDesk01 A0)
DOELSEIF ([tswDesk01] eq "AI" or [tacPC01] eq "off")
(set tacPC01 off)
(set tacPC02 off)
(setreading tswDesk01 channelA AI)
(set tswDesk01 AI)


Schalte ich jetzt tswDesk01 an (A0), gehen beide Aktoren an. Schalte ich aber tswDesk01 wieder aus (AI), tun die Aktoren gar nichts.

Findet jemand den (Logik-)Fehler?

Danke!
Stefan

Bennemannc

Hallo,

versuch mal das "attr NAME-DES-DOIF do always"

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

drhirn

Jetzt kann ich's überhaupt nicht mehr ausschalten ;). Springt immer zurück auf "on" bzw. "AI".

Damian

Zitat von: drhirn am 10 Dezember 2015, 19:30:02
Jetzt kann ich's überhaupt nicht mehr ausschalten ;). Springt immer zurück auf "on" bzw. "AI".

Hast du die aktuelle Version von DOIF, die Loops unterbindet? Ansonsten triggert sich dein Modul selbst, weil du z. B. mit set tacPC01 on und der Abfrage [tacPC01] eq "on" dein Modul selbst wieder antriggerst.

Gruß

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

drhirn

Ja, fhem ist aktuell. Letztes Update heute gemacht.

Das Problem mit den Loops ist mir bewußt. Deshalb hatte ich zuerst auch IF-Abfragen drinnen. Hat aber nichts an der "Nicht-Funktionalität" geändert.

Bennemannc

Hallo,

ich habe noch nicht viel mit DOIF gemacht - aber da war doch etwas mit [?tacPC01] - was bewirkt hat, das nur der Status abgefragt wird und nicht auf dieses Event getriggert wird. Meine mal so etwas in der commandref gelesen zu haben.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

Damian

Zitat von: drhirn am 10 Dezember 2015, 16:09:03
Hi,

ich hätte gerne, dass zwei Aktoren an-/ausgehen und der Status eines Schalters geändert wird, wenn entweder einer der Aktoren oder der Schalter seinen Status ändert.
Weil ich's nicht hinbekomme, habe ich mir Dummies gebaut, mit denen ich teste. Also nicht verwirren lassen.

Die Definition des DOIF:

([tswDesk01] eq "A0" or [tacPC01] eq "on")
(set tacPC01 on)
(set tacPC02 on)
(setreading tswDesk01 channelA A0)
(set tswDesk01 A0)
DOELSEIF ([tswDesk01] eq "AI" or [tacPC01] eq "off")
(set tacPC01 off)
(set tacPC02 off)
(setreading tswDesk01 channelA AI)
(set tswDesk01 AI)


Schalte ich jetzt tswDesk01 an (A0), gehen beide Aktoren an. Schalte ich aber tswDesk01 wieder aus (AI), tun die Aktoren gar nichts.

Findet jemand den (Logik-)Fehler?

Danke!
Stefan

Die Logik dieser Abfrage erschließt sich für mich nicht.

Du willst etwas auf on schalten, wenn es schon on ist?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

drhirn

Hi Damian,

berechtigte Frage.
Im konkreten Fall sind's zwei schaltbare Steckdosen. Auf der einen hängt mein PC, auf der anderen die gesamte Peripherie (Monitor, Boxen, etc.). Es sollten also sinnvoller weise immer beide gleichzeitig ein oder aus sein. Wenn also Steckdose 1 (tacPC01) ein geht, soll Steckdose 2 (tacPC02) auch ein gehen. Und umgekehrt.

Schalten werde ich das ganze über einen od. mehrere EnOcean Schalter (tswDesk01) oder über TabletUI-Switches. Was relativ einfach zu realisieren wäre.

Ich kann aber nicht garantieren, dass genau so eingeschalten wird, wie ich mir das überlegt habe. Es gibt da gewisse Unabwägbarkeiten (=Freundin ;) ). Deshalb muss ich auch den Fall abfangen, dass eben nicht über die Schalter eingeschalten wird.

Und - um's dann richtig kompliziert zu machen - darf auch nicht abgeschaltet werden, solange der PC noch Strom zieht, bzw. ein PRESENCE "present" ist.

Wie schon gesagt, war eine meiner Versionen mit IF-Abfragen aufgebaut ("schalte nur an, wenn Gerät aus"). Siehe folgenden Code. Hat aber nichts an meinem grundlegenden Problem geändert.


([tswDesk01] eq "A0" or [tacPC01] eq "on")
(IF ([tacPC01] eq "off")(set tacPC01 on))
(IF ([tacPC02] eq "off")(set tacPC02 on))
        [...]


Danke!
Stefan

Bennemannc

Hm ....
wäre es da nicht einfacher alles in einen Mehrfachverteiler zu stecken und den über eine Schaltsteckdose zu bedienen ? Es ist da ja auch immer noch die "present" frage, die ja auch noch abgehandelt werden muss. Dann wird das ganze ja noch komplexer.
Schau Dir mal "Structure" an - das ist doch dafür gemacht worden um mehrere Geräte zusammen zu schalten.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

drhirn

Mehrfachverteiler geht nicht, weil ich dann nicht mehr zuverlässig entscheiden kann, ob der PC aus, im Standby oder an ist. Leider.

"Structure" geistert mir auch schon länger im Kopf herum. Ich bin mir nur nicht sicher, ob das mein Problem lösen wird. Weil ich ja trotzdem nicht weiß, wie genau eingeschaltet wird.

drhirn

Folgender Code funktioniert übrigens optimal


([tacPC02] eq "on")
(IF ([tacPC01] ne "on")(set tacPC01 on))
(IF ([tswDesk01:channelA] ne "A0")(setreading tswDesk01 channelA A0))
(IF ([tswDesk01] ne "A0")(set tswDesk01 A0))
DOELSEIF ([tacPC02] eq "off")
(IF ([tacPC01] ne "off")(set tacPC01 off))
(IF ([tswDesk01:channelA] ne "AI")(setreading tswDesk01 channelA AI))
(IF ([tswDesk01] ne "AI")(set tswDesk01 AI))


Sobald ich aber ein or ins DOIF oder DOELSEIF hinzufüge, ist vorbei mit lustig.
Kann das sein, dass genau die neue DOIF-Version, die Schleifen unterbindet, mein Vorhaben verhindert?

Damian

Zitat von: drhirn am 11 Dezember 2015, 10:54:15
Folgender Code funktioniert übrigens optimal


([tacPC02] eq "on")
(IF ([tacPC01] ne "on")(set tacPC01 on))
(IF ([tswDesk01:channelA] ne "A0")(setreading tswDesk01 channelA A0))
(IF ([tswDesk01] ne "A0")(set tswDesk01 A0))
DOELSEIF ([tacPC02] eq "off")
(IF ([tacPC01] ne "off")(set tacPC01 off))
(IF ([tswDesk01:channelA] ne "AI")(setreading tswDesk01 channelA AI))
(IF ([tswDesk01] ne "AI")(set tswDesk01 AI))


Sobald ich aber ein or ins DOIF oder DOELSEIF hinzufüge, ist vorbei mit lustig.
Kann das sein, dass genau die neue DOIF-Version, die Schleifen unterbindet, mein Vorhaben verhindert?

IF-Abfragen kannst du auch einfach mit einem Filter ersetzen und unabhängig davon die Befehle in einer Sequenz mit Komma hintereinander angeben.

DOIF ([tacPC02] eq "on")
  (set tacPC01:FILTER=STATE!=on on, setreading tswDesk01:FILTER=tswDesk01!=A0 channelA A0, ....)
DOELSEIF ([tacPC02] eq "off")
  (set ....)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

drhirn

Hmm, schon extrem cool das Modul!

Trotzdem wird leider noch immer nicht zuverlässig getriggert. Ich glaub, ich überleg mir da was anderes.

Danke für die Unterstützung!