FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: rhoffm34 am 23 November 2022, 21:52:24

Titel: Homematic, an allen WT u. RT den Status ControlMode abfragen und auswerten
Beitrag von: rhoffm34 am 23 November 2022, 21:52:24
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ß.
Titel: Antw:Homematic, an allen WT u. RT den Status ControlMode abfragen und auswerten
Beitrag von: betateilchen am 23 November 2022, 22:13:14
In dem if Vergleich kannst in der Form nicht mit regex arbeiten.
Titel: Antw:Homematic, an allen WT u. RT den Status ControlMode abfragen und auswerten
Beitrag von: rhoffm34 am 23 November 2022, 23:52:05
OK, wie geht´s dann besser?
Titel: Antw:Homematic, an allen WT u. RT den Status ControlMode abfragen und auswerten
Beitrag von: betateilchen am 23 November 2022, 23:56:35
Perl Grundlagen aneignen. Aber das ist nicht Thema dieses Forums.
Titel: Antw:Homematic, an allen WT u. RT den Status ControlMode abfragen und auswerten
Beitrag von: rhoffm34 am 24 November 2022, 00:01:17
Ok, ich habe mehrere versuche unternommen aber mit meinem Wissen bekomme ich das nicht hin. Trotzdem Danke.
Titel: Antw:Homematic, an allen WT u. RT den Status ControlMode abfragen und auswerten
Beitrag von: rhoffm34 am 24 November 2022, 00:07:11
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.
Titel: Antw:Homematic, an allen WT u. RT den Status ControlMode abfragen und auswerten
Beitrag von: betateilchen am 24 November 2022, 01:05:10
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?
Titel: Antw:Homematic, an allen WT u. RT den Status ControlMode abfragen und auswerten
Beitrag von: Damian am 24 November 2022, 07:40:03
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
Titel: [ Gelöst ]Antw:Homematic, an allen WT u. RT den Status ControlMode abfragen und
Beitrag 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.
Titel: Antw:[ Gelöst ]Antw:Homematic, an allen WT u. RT den Status ControlMode abfragen und
Beitrag von: Damian am 26 November 2022, 13:27:31
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 ;)