Homematic, an allen WT u. RT den Status ControlMode abfragen und auswerten

Begonnen von rhoffm34, 23 November 2022, 21:52:24

Vorheriges Thema - Nächstes Thema

rhoffm34

Hallo zusammen,

ich möchte an allen meinen Homematic Wandthermostaten und Raumthermostaten auslesen wie der controlMode Status ist. Ich kenne leider nicht die richtige Syntax...

Mein Plan war ein Notify mit folgendem Code zu nutzen:

HM_WT_.*controlMode.*|HM_RT_.*controlMode.*
{
if (
HM_RT_.*:controlMode eq "auto" && HM_WT_.*controlMode eq "auto"
)
        { fhem("set Flag_Hzg_Main_manVSauto auto"); }
  else
  { fhem("set Flag_Hzg_Main_manVSauto manuelllll"); }
}


Das funktioniert so aber nicht...

Vielleicht kann mir jemand einen Stubs geben...

Danke und Gruß.

betateilchen

In dem if Vergleich kannst in der Form nicht mit regex arbeiten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!


betateilchen

Perl Grundlagen aneignen. Aber das ist nicht Thema dieses Forums.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rhoffm34

Ok, ich habe mehrere versuche unternommen aber mit meinem Wissen bekomme ich das nicht hin. Trotzdem Danke.

rhoffm34

Vielleicht hat jemand anderes, außer Betateilchen noch einen direkten Tipp...

Wenn ich es so mache dann klappt das mit der Auswertung.


HM_WT_.*controlMode.*|HM_RT_.*controlMode.*
{
if (
ReadingsVal('HM_RT_BAD_ELTERN_Fussboden_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_BAD_ELTERN_Handtuch_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_Bad_Kinder_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_BueroGarten_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_BueroVorne_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_Einlieger_Bad_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_Einlieger_WZ_Garten_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_Einlieger_WZ_Vorne_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_Kinder_Ankleide_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_Party_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_xy_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_xx_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_Schlafzimmer_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_WZ_li_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_RT_WZ_re_Clima', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_BAD_Eltern_Climate', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_BAD_Kinder_Climate', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_Buero_Climate', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_Einlieger_Climate', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_Einlieger_Bad_Climate', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_Kinder_Ankleide_Climate', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_Party_Climate', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_xy_Climate', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_xx_Climate', 'controlMode', '1') eq "auto" &&
ReadingsVal('HM_WT_Wohnzimmer_Climate', 'controlMode', '1') eq "auto"
)
        { fhem("set Flag_Hzg_Main_manVSauto auto"); }
  else
  { fhem("set Flag_Hzg_Main_manVSauto manuell"); }    
}


Ich wollte es nur etwas schlanker machen... Dafür fehlt mir aber die Kenntnis.

betateilchen

Der Umkehrschluss zu "alle stehen auf auto" ist doch "eines steht nicht auf auto"

Also:

Mit devspec2array (siehe commandref) alle devices in ein array packen, über das array loopen und schauen, ob eines der devices NICHT auf "auto" steht.

Aber auch dafür braucht es wieder perl Kenntnisse.




Aber würde es nicht völlig reichen, wenn Dein notify einfach darauf triggert, dass ein controlMode nicht "auto" ist? Wozu der Vergleich über alle devices?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Oder als Einzeiler:

DOIF {if ([#"^(HM_WT_|HM_RT_):^controlMode":controlMode:$_ ne "auto"] > 0) {fhem("set Flag_Hzg_Main_manVSauto manuell")} else {fhem("set Flag_Hzg_Main_manVSauto auto")}}

siehe dazu: https://fhem.de/commandref_DE.html#DOIF_aggregation
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rhoffm34

Hey Damian, vielen Dank, genau das habe ich mit dem Stubs gemeint. Aggregation kannte ich bis dato nicht. Hätte ich so auch nur schwer gefunden.

Vielen Dank für Deine Hilfe. Funktioniert Prima.

Damian

Zitat von: rhoffm34 am 26 November 2022, 02:24:36
Hey Damian, vielen Dank, genau das habe ich mit dem Stubs gemeint. Aggregation kannte ich bis dato nicht. Hätte ich so auch nur schwer gefunden.

Vielen Dank für Deine Hilfe. Funktioniert Prima.

Mein Vorschlag war im DOIF-Perlmodus. Dieser arbeitet ohne den eigenen Zustand auszuwerten. Das bedeutet, dass bei jedem Event der Thermostate der Modus manuell/auto geschaltet wird.

Besser wäre es in diesem Fall, das im DOIF-FHEM-Modus zu realisieren, denn dann wird nur auf manuell/auto umgeschaltet, wenn dieser Modus beim vorherigen Trigger nicht bereits gesetzt wurde:

DOIF ([#"^(HM_WT_|HM_RT_):^controlMode":controlMode:$_ ne "auto"] > 0) (set Flag_Hzg_Main_manVSauto manuell) DOELSE (set Flag_Hzg_Main_manVSauto auto)

und man kommt sogar ohne Perl aus ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF