Item.state Übergabe u. Überwachung mit Timer
Verfasst: 22. Jun 2020 23:25
Nachdem ich meine Wandthermostate u. Themostatventile auf HomematicIP umgestellt habe,
möchte den Status meiner alten MAX! Fensterkontakte an HomematicIP übergeben.
Da das Homematic System ein wenig träge bei der Verarbeitung ist, möchte ich nach 10 Sek. kontrollieren ob der Status der Fensterkontakte übergeben wurde und ggf. das "sendCommand" wiederholen.
Die items der Fensterkontakte sind wie folgt angelegt:
Über eine Rule werden die einzelnen Kontakte Raumweise zusammen geführt und an die DummyItems übergeben!.
Die Items für den Fensterkontakt am Homematic-System sind wie folgt angelegt.
Diese sind die speziellen Ein-/Ausgänge für die Gruppensteuerung (Gruppenchannel) bei Homematic
Jetzt zur eigentlichen Rule bzw. Problem !
(die ganzen logInfos nur temporär zur Kontrolle)
Die Rule funktioniert nur beim MX_WEZ_Fenster_Status -> "OPEN", bei MX_WEZ_Fenster_Status -> "CLOSED" erfolgt kein Übertrag nach Homematic.
LOG:
Ich habe verschiedenste Varianten probiert:
z.B. mit Variablen
valStatus = MX_WEZ_Fenster_Status.state.toString
valStatus = MX_WEZ_Fenster_Status.state
ohne Variablen
HM_WEZ_Fenster.sendCommand(MX_WEZ_Fenster_Status.state)
HM_WEZ_Fenster.sendCommand(MX_WEZ_Fenster_Status.state.toString)
... das Ergebnis ist eigentlich immer gleich ;-(
Wäre schön wenn mir jmd. nen Tipp geben kann.
[openHab2 (v. 2.5) via Docker auf Synology DS216II ]
möchte den Status meiner alten MAX! Fensterkontakte an HomematicIP übergeben.
Da das Homematic System ein wenig träge bei der Verarbeitung ist, möchte ich nach 10 Sek. kontrollieren ob der Status der Fensterkontakte übergeben wurde und ggf. das "sendCommand" wiederholen.
Die items der Fensterkontakte sind wie folgt angelegt:
Code: Alles auswählen
/* Allgemein: Dummy-Items */
// Fensterstatus nach Rule "Fenster-Toggle" für Homematic-Steuerung
String MX_WEZ_Fenster_Status // Wohn-/Esszimmer
String MX_KZ1_Fenster_Status // Kinderzimmer 1
String MX_KZ2_Fenster_Status // Kinderzimmer 2
// -------------------
/* Türkontakt Wohnzimmer */
// Fensterkontakt (OPEN/CLOSED)
Contact MX_WEZ_Kontakt_TuerWz "Terrasse [MAP(heizung.map):%s]" (grpKontakte) {channel="max:shuttercontact:NEQ1633554:NEQ0846023:contact_state"}
Code: Alles auswählen
/* Wohn-/Esszimmer */
if ((MX_WEZ_Kontakt_TuerWz.state == CLOSED) && (MX_WEZ_Kontakt_FensterWz.state == CLOSED) && (MX_WEZ_Kontakt_FensterEz.state == CLOSED)) {
MX_WEZ_Fenster_Status.postUpdate("CLOSED")
}
else if ((MX_WEZ_Kontakt_TuerWz.state == OPEN) || (MX_WEZ_Kontakt_FensterWz.state == OPEN) || (MX_WEZ_Kontakt_FensterEz.state == OPEN)) {
MX_WEZ_Fenster_Status.postUpdate("OPEN")
}
/* Kinderzimmer 1 */
// ......
Diese sind die speziellen Ein-/Ausgänge für die Gruppensteuerung (Gruppenchannel) bei Homematic
Code: Alles auswählen
// Fensterstatus (OPEN/CLOSED)
String HM_WEZ_Fenster {channel="homematic:HmIP-HEATING:ccu:INT0000001:1#WINDOW_STATE"}
(die ganzen logInfos nur temporär zur Kontrolle)
Code: Alles auswählen
val String valFileName = "HomeNet.individual.Heizungssteuerung.rules"
val String valRuleName
val String valStatus
var Timer vTimer = null
var Number vZaehler = null
rule "Fenster-Status" // Warteschleife für die Änderungen an den Türkontakten
when
Item MX_WEZ_Fenster_Status received update or
Item MX_KZ1_Fenster_Status received update or
Item MX_KZ2_Fenster_Status received update
then
val valRuleName = "Fenster-Status"
// Wohn-/Esszimmer
if (triggeringItem.name == "MX_WEZ_Fenster_Status") {
vTimer?.cancel
vTimer = null // Timer auf "null"
vZaehler = 1 // Zähler auf "null"
valStatus = ""
logInfo (valFileName + ":" + valRuleName, "getriggert: " + triggeringItem.name)
// Statusübergabe an HomematiIP (open/closed)
valStatus = MX_WEZ_Fenster_Status.state.toString
HM_WEZ_Fenster.sendCommand(valStatus)
logInfo (valFileName + ":" + valRuleName, "variable: " + valStatus)
vTimer = createTimer(now.plusSeconds(10), [|
logInfo (valFileName + ":" + valRuleName, "Status HM: " + HM_WEZ_Fenster.state + " / Status MX: " + valStatus)
// Überprüfung des Fensterstatus (HomematikIP / MAX-Fensterkontakte) nach 10 Sekunden
if (HM_WEZ_Fenster.state != valStatus) {
// erneute Statusübergabe
HM_WEZ_Fenster.sendCommand(valStatus)
logInfo (valFileName + ":" + valRuleName, "Schleifenstatus HM: " + HM_WEZ_Fenster.state + " / Schleifenstatus MX: " + valStatus + " / Zähler: " + vZaehler)
vZaehler = vZaehler + 1
// Solange Timer neustarten bis Zählerwert erreicht
if (vZaehler <= 5) {
vTimer.reschedule(now.plusSeconds(10))
}
else {
logWarn (valFileName + ":" + valRuleName, "Fehler bei Statusübergabe !")
}
}
else {
logInfo (valFileName + ":" + valRuleName, "Status übertragen ! ")
vTimer = null
}
])
}
// Kinderzimmer 1
// analog wie Wohn-/Esszimmer mit entsprechendem "triggeringItem.name"
end
LOG:
Code: Alles auswählen
2020-06-22 22:24:37.737 [INFO ] [izungssteuerung.rules:Fenster-Status] - getriggert: MX_WEZ_Fenster_Status
2020-06-22 22:24:37.739 [INFO ] [izungssteuerung.rules:Fenster-Status] - variable: OPEN
2020-06-22 22:24:47.741 [INFO ] [izungssteuerung.rules:Fenster-Status] - Status HM: OPEN / Status MX: OPEN
2020-06-22 22:24:47.743 [INFO ] [izungssteuerung.rules:Fenster-Status] - Status übertragen !
2020-06-22 22:27:01.423 [INFO ] [izungssteuerung.rules:Fenster-Status] - getriggert: MX_WEZ_Fenster_Status
2020-06-22 22:27:01.426 [INFO ] [izungssteuerung.rules:Fenster-Status] - variable: CLOSED
2020-06-22 22:27:11.428 [INFO ] [izungssteuerung.rules:Fenster-Status] - Status HM: OPEN / Status MX: CLOSED
2020-06-22 22:27:11.434 [INFO ] [izungssteuerung.rules:Fenster-Status] - Schleifenstatus HM: OPEN / Schleifenstatus MX: CLOSED / Zähler: 1
2020-06-22 22:27:21.445 [INFO ] [izungssteuerung.rules:Fenster-Status] - Status HM: OPEN / Status MX: CLOSED
2020-06-22 22:27:21.448 [INFO ] [izungssteuerung.rules:Fenster-Status] - Schleifenstatus HM: OPEN / Schleifenstatus MX: CLOSED / Zähler: 2
2020-06-22 22:27:31.451 [INFO ] [izungssteuerung.rules:Fenster-Status] - Status HM: OPEN / Status MX: CLOSED
2020-06-22 22:27:31.453 [INFO ] [izungssteuerung.rules:Fenster-Status] - Schleifenstatus HM: OPEN / Schleifenstatus MX: CLOSED / Zähler: 3
2020-06-22 22:27:41.455 [INFO ] [izungssteuerung.rules:Fenster-Status] - Status HM: OPEN / Status MX: CLOSED
2020-06-22 22:27:41.459 [INFO ] [izungssteuerung.rules:Fenster-Status] - Schleifenstatus HM: OPEN / Schleifenstatus MX: CLOSED / Zähler: 4
2020-06-22 22:27:51.462 [INFO ] [izungssteuerung.rules:Fenster-Status] - Status HM: OPEN / Status MX: CLOSED
2020-06-22 22:27:51.470 [INFO ] [izungssteuerung.rules:Fenster-Status] - Schleifenstatus HM: OPEN / Schleifenstatus MX: CLOSED / Zähler: 5
2020-06-22 22:27:51.471 [WARN ] [izungssteuerung.rules:Fenster-Status] - Fehler bei Statusübergabe !
z.B. mit Variablen
valStatus = MX_WEZ_Fenster_Status.state.toString
valStatus = MX_WEZ_Fenster_Status.state
ohne Variablen
HM_WEZ_Fenster.sendCommand(MX_WEZ_Fenster_Status.state)
HM_WEZ_Fenster.sendCommand(MX_WEZ_Fenster_Status.state.toString)
... das Ergebnis ist eigentlich immer gleich ;-(
Wäre schön wenn mir jmd. nen Tipp geben kann.
[openHab2 (v. 2.5) via Docker auf Synology DS216II ]