FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Hawkeye am 09 Mai 2019, 16:20:11

Titel: [gelöst] HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Hawkeye am 09 Mai 2019, 16:20:11
Hallo,
ich will meine in ihren Möglichkeiten ziemlich beschränkte HomeMatic CCU2 mit FHEM erweitern. Die CCU2 läuft dabei ganz normal weiter. An ihr sind auch alle HomeMatic Geräte angemeldet. Die FHEM ist auf einem Raspberry Pi 3 installiert.

Die HomeMatic steht unter FHEM als Gerät "d_ccu" zur Verfügung. Alle 10 Sekunden werden die Systemvariablen der CCU ausgelesen und stehen unter d_ccu als Readings zur Verfügung. So auch "Alarm_Einstellung" vom Typ Zahl.

Die FHEM steuert jetzt schon super die CCU (Google Müllkalender sorgt für FHEM-EMail-Versand und Sprachelementausgabe via CCU wenn die CCU in verschiedenen Situationen Bewegungen im Flur erkennt). So weit so gut.

Nur umgekehrt bekomme ich es einfach nicht gebacken. Ich versuche jetzt schon seit Tagen die FHEM auf die CCU Systemvariable Alarm_Einstellung reagieren zu lassen. Dabei handelt es sich um einen kombinierten Abwesenheits- & Heizungsstatus. Wechselt dieser auf den Wert 4 oder 5 (bzw. wird er >3 bzw. >=4) so soll auch die Squeezebox ausgeschaltet werden. (Das hab ich alleine auch im Griff: set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1

Mein Problem ist jetzt nur beides über ein notify zu verbinden, so dass die CCU-Variable das Ausschalten triggert. Mein 'fortschrittlichster' Versuch ist im Moment dies:

define n_dCcuAlarmEinstellung_geq4 notify { if (ReadingsVal("d_ccu","Alarm_Einstellung",99) > 3) {fhem("set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1")} }

Aber es funktioniert leider nicht. Ich bin jetzt echt mit meinem Latein am Ende. Vielleicht weiß hier noch jemand Rat!


Titel: Antw:HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Otto123 am 09 Mai 2019, 16:56:19
Hi,

das mit dem notify ist relativ einfach :)
https://wiki.fhem.de/wiki/Notify

Mach als erstes mal den Eventmonitor auf, gib d_ccu.* in den Filter und dann suchst Du Dir den Event der Deiner Meinung nach passt und erzeugst erst mal ein Grundgerüst.
Dann sehen wir weiter :)

Gruß Otto
Titel: Antw:HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Hawkeye am 10 Mai 2019, 11:37:40
Hallo Otto,
vielen Dank für Deine Antwort!

Ich hab es jetzt so gemacht, wie Du gesagt hast, den Filter aber doch lieber nur auf "Alarm_Einstellung" gesetzt, weil von der CCU so viele Werte gemeldet werden. Wie erhofft bekam ich dann alle 10 Sekunden die Events gemeldet. Für zwei Abfrage-Zyklen hab ich die Systemvariable in der CCU dann von 0 auf 4 gesetzt und anschließend wieder zurück.

2019-05-10 11:30:35 HMCCU d_ccu Alarm_Einstellung: 0.000000
2019-05-10 11:30:35 HMCCU d_ccu Alarm_Einstellung_Wechsel: 0.000000
2019-05-10 11:30:35 HMCCU d_ccu Alarm_Einstellung_Wechsel_4: 
2019-05-10 11:30:35 HMCCU d_ccu Alarm_Einstellung_Wechsel_5: 
2019-05-10 11:30:45 HMCCU d_ccu Alarm_Einstellung: 0.000000
2019-05-10 11:30:45 HMCCU d_ccu Alarm_Einstellung_Wechsel: 0.000000
2019-05-10 11:30:45 HMCCU d_ccu Alarm_Einstellung_Wechsel_4: 
2019-05-10 11:30:45 HMCCU d_ccu Alarm_Einstellung_Wechsel_5: 
2019-05-10 11:30:55 HMCCU d_ccu Alarm_Einstellung: 0.000000
2019-05-10 11:30:55 HMCCU d_ccu Alarm_Einstellung_Wechsel: 0.000000
2019-05-10 11:30:55 HMCCU d_ccu Alarm_Einstellung_Wechsel_4: 
2019-05-10 11:30:55 HMCCU d_ccu Alarm_Einstellung_Wechsel_5: 
2019-05-10 11:31:05 HMCCU d_ccu Alarm_Einstellung: 4.000000
2019-05-10 11:31:05 HMCCU d_ccu Alarm_Einstellung_Wechsel: 0.000000
2019-05-10 11:31:05 HMCCU d_ccu Alarm_Einstellung_Wechsel_4: 
2019-05-10 11:31:05 HMCCU d_ccu Alarm_Einstellung_Wechsel_5: 
2019-05-10 11:31:15 HMCCU d_ccu Alarm_Einstellung: 4.000000
2019-05-10 11:31:15 HMCCU d_ccu Alarm_Einstellung_Wechsel: 0.000000
2019-05-10 11:31:15 HMCCU d_ccu Alarm_Einstellung_Wechsel_4: 
2019-05-10 11:31:15 HMCCU d_ccu Alarm_Einstellung_Wechsel_5: 
2019-05-10 11:31:25 HMCCU d_ccu Alarm_Einstellung: 0.000000
2019-05-10 11:31:25 HMCCU d_ccu Alarm_Einstellung_Wechsel: 0.000000
2019-05-10 11:31:25 HMCCU d_ccu Alarm_Einstellung_Wechsel_4: 
2019-05-10 11:31:25 HMCCU d_ccu Alarm_Einstellung_Wechsel_5:


Zumindest die Wert-Übergabe an die FHEM scheint zu funktionieren.

Viele Grüße
Klaus
Titel: Antw:HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Otto123 am 10 Mai 2019, 11:44:58
Hallo Klaus,

ich bin mir jetzt nicht sicher welches für Dein notify der richtige Event wäre, der hier?
2019-05-10 11:30:35 HMCCU d_ccu Alarm_Einstellung: 0.000000
Wenn ja hast Du im Eventmonitor mal ein noitfy anlegen lassen?

Das wird irgendwie so aussehen:
define bla notify d_ccu:Alarm_Einstellung:.* {}
Siehst Du das deinem notify Entwurf etwas Wesentliches fehlte!?

Jetzt kannst Du entweder Deinen Code zwischen {} packen oder erstmal wie im Wiki beschrieben einen Log Eintrag schreiben.

Gruß Otto
Titel: Antw:HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Hawkeye am 10 Mai 2019, 12:41:25
Hallo Otto,
ja, ich hab jetzt gerade noch mit dem von Dir zugeschickten Link für die Dokumentation von Notify herumgespielt. Stimmt, da fehlte ein großer Brocken! Ich hab jetzt mal die folgenden Versuche gemacht. (Bitte wegen der Reihenfolge nicht wundern, ich hab schon vor Deiner 2. Antwort mit dem Experimentieren angefangen...)

1. Versuch
define n_dCcuAlarmEinstellung_geq4 notify d_ccu:Alarm_Einstellung.* set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1
OK! Hierbei wird bei jeder Aktualisierung der Werte von der CCU in die FHEM die Squeezebox ausgeschaltet. Egal welcher Wert geliefert wird.

Ich hab jetzt gerade gesehen, in Deinem Beispiel ist auch der zweite Doppelpunkt vorhanden. Muss ich auch mal ausprobieren...
define n_dCcuAlarmEinstellung_geq4 notify d_ccu:Alarm_Einstellung:.* set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1
OK! Funktioniert auch bei jeder Aktualisierung!

1.b Versuch
Entsprechend Deinem Codebeispiel: Ich Versuch es jetzt doch nochmal auch mit dem { if ...} (siehe Anmerkung unten: 2. Versuch)
define n_dCcuAlarmEinstellung_geq4 notify d_ccu:Alarm_Einstellung:.* { if (ReadingsVal("d_ccu","Alarm_Einstellung",99) > 3) {fhem("set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1")} }
OK! Es klappt!!!
aber - ich will es jetzt genau wissen...  :-)

2. Versuch
entsprechend dem Beispiel in der Notify-Anleitung
"dimmer:pct:.(100|7[6-9]|[89][0-9]) → reagiert, wenn pct einen Wert über 75 annimmt."
wollte ich die Wertabfrage direkt in das Notify-Suchmuster und nicht in das Notify-Command (wie weiter oben) packen. Gefällt mir besser und sollte wenn es funktioniert performanter sein...
Also hab ich es mit folgendem versucht:
define n_dCcuAlarmEinstellung_geq4 notify d_ccu:Alarm_Einstellung:.(4|5) set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1
es wurde bei keinem Wert von 0-5 ausgelöst :-(

Da ich mir mit dem Punkt vor den Werten nicht ganz sicher war (es wird ja eigentlich nur nach EINER einstelligen Zahl gesucht...), hab ich es auch einmal mit folgendem versucht:
define n_dCcuAlarmEinstellung_geq4 notify d_ccu:Alarm_Einstellung:(4|5) set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1
wieder nichts...

Hast Du da auch einen Rat für mich?

Vielen Dank schon einmal und viele Grüße
Klaus
Titel: Antw:HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Hawkeye am 10 Mai 2019, 13:40:33
1.c Versuch
In Abwandlung von Versuch 1.b hat mich jetzt mal das Verhalten interessiert, wenn ich nicht auf beliebig viele folgende Zeichen d_ccu:Alarm_Einstellung:.*, sondern auf ein folgendes Zeichen teste d_ccu:Alarm_Einstellung:.
define n_dCcuAlarmEinstellung_geq4 notify d_ccu:Alarm_Einstellung:. { if (ReadingsVal("d_ccu","Alarm_Einstellung",99) > 3) {fhem("set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1")} }
Bei den Zahlen von 0-5 sollte es ja im Prinzip der Fall sein und passen...
Ok, es wird jetzt wieder überhaupt nicht reagiert...

Mein Verdacht ist jetzt, dass ich hier mit der Logik eines Stringvergleiches und nicht eines Zahlenvergleichs herangehen muss...

Versuch 3
Ich suche jetzt ob 4 oder 5, gefolgt von einem (Dezimal)Punkt und beliebig vielen Nullen kommt:
define n_dCcuAlarmEinstellung_geq4 notify d_ccu:Alarm_Einstellung:(4|5)\.0* set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1
funktioniert nicht :-(

Versuch 3b
Ich setze jetzt davor noch einen Punkt. Ehrlich gesagt ist mir aber nicht ganz klar warum das gut sein soll. So wie ich es verstehe, kann jetzt vor der 4 oder der 5 ein beliebiges Zeichen stehen (oder bezieht sich der Punkt auf "(4|5)"? Dann ist mir die Logik der Syntax aber nicht klar.
define n_dCcuAlarmEinstellung_geq4 notify d_ccu:Alarm_Einstellung:.(4|5)\.0* set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1
OK! Es funktioniert!

Mir ist aber immer noch nicht klar, warum hier ein Punkt stehen muss: d_ccu:Alarm_Einstellung:.(4|5)\.0*
Steht da etwa ein Leerzeichen?

Versuch 4
Ein Leerzeichen lässt sich ja mit "\s" suchen. Also:
define n_dCcuAlarmEinstellung_geq4 notify d_ccu:Alarm_Einstellung:\s(4|5)\.0* set HiFiBerry_Badezimmer,HiFiBerry_Flur,HiFiBerry_Kueche,HiFiBerry_Schlafzimmer,HiFiBerry_Werkstatt,HiFiBerry_Wohnzimmer pause 1

OK! Es funktioniert! Hier wird anscheinend ein Leerzeichen eingefügt!

Weiß jemand, ob vor den Werten von Readings immer ein Leerzeichen steht? (auch bei String etc.)

Viele Grüße
Klaus
Titel: Antw:HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Otto123 am 10 Mai 2019, 15:12:53
Hallo Klaus,

es geht beim Event nicht um Readings! Auch wenn es da in dem Fall einen Zusammenhang gibt!
Es geht um den Event!
2019-05-10 11:31:05 HMCCU d_ccu Alarm_Einstellung: 4.000000
Du triggerst auf device:regexp, Dein Device ist d_ccu.
Also ist der erste Teil d_ccu jetzt kommt ein Doppelpunkt als Trenner!
d_ccu:
Dann kommt der Event vom Gerät Alarm_Einstellung: 4.000000 Der Doppelpunkt gehört zum Event! Der ist nicht immer da!
Nach dem Readingname steht ein Leerzeichen, das kannst Du treffen mit einem Punkt.
Diese Leerzeichen ist beim setzen von Readings wahrscheinlich immer anzutreffen. Zwingend ist das im Event gar nicht!
d_ccu:Alarm_Einstellung:.
Jetzt kommt der Rest, kannst Du beliebig genau machen
d_ccu:Alarm_Einstellung:.4.000000 oder d_ccu:Alarm_Einstellung:.4.*
oder eben d_ccu:Alarm_Einstellung:.[4,5].* oder Deine Variante.

Gruß Otto
Titel: Antw:HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Hawkeye am 11 Mai 2019, 12:31:11
Hallo Otto,
vielen Dank für Deine detaillierte Antwort!

Ich glaube sie gibt mir auch gleich die Antwort auf meine nächste Überlegung:
Ich 'ziehe' die Systemvariablen der CCU alle 10 Sekunden.
Ist der Wert von "Alarm_Einstellung" gleich 4 oder 5, so werden alle 10 Sekunden die Squeezebox-Geräte abgeschaltet.
Aber eigentlich reicht es mir ja, wenn sie nur bei einem Wert-Wechsel auf 4 oder 5 einmalig abgeschaltet werden. Im Moment stört es zwar nicht, aber bei meinem nächsten Vorhaben.

Da, wie Du schreibst, der Event der komplette Teil "Alarm_Einstellung: 4.000000" ist, triggert dieser über regexp durch das schreiben/setzen alle 10 Sekunden. Unabhängig davon ob sich der Event(Wert) ändert. (Ein Triggern nur bei Wertänderung ist somit nicht möglich. Ich muss es vielmehr später selbst 'abfangen'.)

Wenn ich das Abschalten somit nur bei einer Änderung auf 4 oder 5 auslösen will, dann nehm ich an, werd ich es mit Hilfe einer (Vergleichs-)Varible (dummy) machen müssen. Bei jedem Setzen/Schreiben von Alarm_Einstellung ... vergleich ich dann Variableninhalt mit neuem Wert und wenn dieser auf 4 oder 5 wechselt, führ ich meine Aktion aus. Anschließend übernehm ich immer bzw. nur nach Änderungen den Wert von Alarm_Einstellung ... in die Variable für den nächsten Vergleich.

Oder gibt es da einen eleganteren Weg bzw. kennst Du da vielleicht einen Trick?

Viele Grüße
Klaus
Titel: Antw:HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Otto123 am 12 Mai 2019, 12:30:12
Hallo Klaus,

dafür gibt es allgemein das Attribut event-on-change-reading.
Das verhindert die Erzeugung von Events ohne Werteänderung bzw. erfolgt damit nur ein Event wenn sich der Wert des Readings ändert.
Ich habe allerdings kein HMCCU & Co ich kann nicht sagen ob es das dort gibt und wie es sich genau verhält. Kannst Du ja aber leicht selbst herausfinden, einfach im Eventmonitor beobachten :)
Das es sich um 4 oder 5 handelt hast Du ja im regExp vom notify schon gefilter. Wenn Du im Code dann noch unterschiedliche Aktionen bei 4 oder 5 auslösen willst musst Du es im Code abfragen. Du kannst dabei auch mit $EVTPARTx arbeiten.

Gruß Otto
Titel: Antw:HomeMatic CCU2 Systemvariable soll in FHEM schalten
Beitrag von: Hawkeye am 12 Mai 2019, 12:38:23
Hallo Otto,

VIELEN Dank Dir für die Hinweise. Sie sind im Moment leider noch böhmische Dörfer für mich, aber ich hab jetzt Schlagwörter um gezielt suchen zu können! Das hilft!!!
Im Moment hab ich jetzt blos erstmal festgestellt, dass ich in der Homematic alle Gerätenamen ändern muss, da ich Leerzeichen verwende... Tja, ich hab das vor zwei Jahren zwar mal systematisch getestet was ich für Systemvariablen, Variablen, Geräte und Programme verwenden kann, aber halt nur auf der standalone CCU...
Aber ansonsten wird es mir eh die nächsten Wochen blos langweilig. ;-)

VIELEN Dank Dir nochmal und viele Grüße!
Klaus