Hauptmenü

Status eines DOIF Devices setzen

Begonnen von vbs, 01 Oktober 2023, 19:41:06

Vorheriges Thema - Nächstes Thema

vbs

Hi Ihr,

folgendes Szenario:
1. ich hab einen TV, dessen Status (an oder aus) über ein PRESENCE-Device abgebildet wird (per lan-ping).
2. den TV kann ich per IR-Blaster mit einem On- und einem Off-Befehl schalten
3. den TV möchte ich auch per gassisstant schalten können

Ich hab ein PRESENCE-Device, der den Punkt 1 erfüllt:
defmod wz_tv PRESENCE lan-ping 192.168.2.69
Also das Device zeigt an, ob der Fernseher an oder aus ist.


Und ich hab ein DOIF-Device, das die Punkte 2 + 3 erfüllt:
defmod wz_tv_new DOIF ([$SELF:"on"])\
   (set wz_irblaster send IR_LG_TV_On)\
DOELSEIF ([$SELF:"off"])\
   (set wz_irblaster send IR_LG_TV_Off)
attr wz_tv_new do always
attr wz_tv_new gassistantName Fernseher
attr wz_tv_new genericDeviceType switch
attr wz_tv_new room GoogleAssistant,Wohnzimmer
attr wz_tv_new setList on off

Also ich kann den TV steuern per "set wz_tv_new on" (oder off).

Das Doofe daran ist, dass die Logik des TVs in zwei Devices gespalten ist: das PRESENCE zeigt den Zustand an und das DOIF übernimmt das Steuern. Und nach dem Schalten per DOIF, wird dann später der Zustand in PRESENCE sichtbar.

Die Frage ist: gibt es eine Möglichkeit, den Zustand von dem PRESENCE im DOIF abzubilden? Also der state des DOIF sollte immer der gleiche Wert sein, wie das state des PRESENCE. Das Problem ist, dass das DOIF ja seinen state selbst verwaltet. Also man müsste es hinbekommen, dass das DOIF seinen state nicht mehr selbst verändert und dafür aber den state vom PRESENCE annimmt.

Also so als Pseudo-Code im DOIF:
([$SELF:"on"])
   (set wz_irblaster send IR_LG_TV_On)
DOELSEIF ([$SELF:"off"])
   (set wz_irblaster send IR_LG_TV_Off)
DOELSEIF ([wz_tv:"on"])
   (set $SELF state on)
DOELSEIF ([wz_tv:"off"])
   (set $SELF state off)

Also die ersten beiden Blöcke steuern das Device, aber sollten den state nicht ändern. und die Blöcke drei und vier reagieren auf Änderungen am PRESENCE und "kopieren" dessen state.

Geht sowas irgendwie? Danke euch!

Damian

Den Status eines DOIF-Devices kannst du im Perl-Modus selbst setzen:

https://wiki.fhem.de/wiki/DOIF/Perl-Modus
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

vbs

Ui klasse, danke. Das scheint zu funktionieren:
{                     
  if ([$SELF:"on"]) {
    fhem_set"wz_irblaster send IR_LG_TV_On"
  }               
  elsif ([$SELF:"off"]) {
    fhem_set"wz_irblaster send IR_LG_TV_Off"
  }
  elsif ([wz_tv:"present"]) {
    set_State ("on");
  }
  elsif ([wz_tv:"absent"]) {
    set_State ("off");
  }
}

Mal so allgemein zum Perl-Modus: Gibt da ja eine wirklich ausführliche Doku, aber mir ist nicht so ganz klar, was konkrete die Vor-/Nachteile von diesem Perl-Modus sind? Ersetzt er den normalen Modus? Ist der Modus einfach neuer und besser und sollte man ab jetzt immer diesen Modus nutzen?
Ist er einfach mächtiger, aber auch komplexer, weil man zB sich selbst um den "state" kümmern muss?

Damian

Der Perl-Modus ist wesentlich mächtiger. Im FHEM-Modus kannst du im Grunde pro DOIF-Device nur einen IF ... ELSEIF .... ELSE ... Ablauf definieren. Im Perl-Modus kannst du dagegen in einem DOIF-Device beliebig viele Abläufe in Blöcken definieren, die unabhängig von einander arbeiten. Die Wiki-Seite ist die offizielle Doku zu diesem Modus - sie beschreibt die komplette Funktionalität des Perl-Modus.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: Damian am 01 Oktober 2023, 21:03:44Der Perl-Modus ist wesentlich mächtiger. Im FHEM-Modus kannst du im Grunde pro DOIF-Device nur einen IF ... ELSEIF .... ELSE ... Ablauf definieren. Im Perl-Modus kannst du dagegen in einem DOIF-Device beliebig viele Abläufe in Blöcken definieren, die unabhängig von einander arbeiten. Die Wiki-Seite ist die offizielle Doku zu diesem Modus - sie beschreibt die komplette Funktionalität des Perl-Modus.

Hier als Beispiel: https://wiki.fhem.de/wiki/DOIF/Automatisierung#Tages-,_Monats-_und_Jahresstatistik_f%C3%BCr_Strom-,_Gas-,_Wasserz%C3%A4hler_und_andere_Z%C3%A4hler

Versuch das mal in einem DOIF-Device im FHEM-Modus zu realisieren ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

vbs

Gottogott... da platzt mir ja der Kopf...  ;D

Damian

Zitat von: vbs am 01 Oktober 2023, 21:24:00Gottogott... da platzt mir ja der Kopf...  ;D

Als Anwender brauchst dafür du aber nur eine Zeile einfügen, um eine komplette Statistik zu erhalten. Als Programmierer musst du natürlich schon ein gewisses Verständnis für die Sache mitbringen, vor allem wenn die Sache beliebig erweiterbar sein soll, hier also der gleiche Programmcode für beliebig viele Sensoren.

Für einfache Ablaufsteuerungen kannst du ruhig beim FHEM-Modus bleiben :)

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