NEWS
[erledigt][Blockly] Homematic Rollo Unreach
-
Hallo liebe Community,
ich habe mir per Blockly ein Script gebaut, welches bei "nicht erreichen" eines Rollos (UNREACH) per Telegram eine Nachricht schicken soll und versuchen soll, den Befehl für "rauf" (level 100%) bzw. "runter" (level 0%) max 10 x ausführen, um danach einen neuen Status per Telegram zu schicken.
Aus irgend einem Grund scheine ich mir hiermit einen Loop eingebaut zu haben, was meinen RPI3 zum Absturz bringt. Im Log von IoBroker siehe ich nur, dass der DUTY_CYCLE erreicht wird bevor er die Grätsche macht.
Könnt ihr mir hierbei helfen?
var kz, timeout, bz, timeout2, wc, timeout3, ezl, timeout4, hwr, timeout5, sz, timeout6, wz, timeout7, yz, timeout8, bu, timeout9, ku, timeout10, ezr, timeout11; on({id: new RegExp('hm-rpc\\.1\\.001118A98B35E3\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B35F7\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B37E3\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B382F\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B3868\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B38B1\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B3906\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B390F\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B3937\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B3947\\.0\\.UNREACH' + "|" + 'hm-rpc\\.1\\.001118A98B3A5F\\.0\\.UNREACH'), val: true}, function (obj) { // Kinderzimmer if (getState("hm-rpc.1.001118A98B35E3.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Kinderzimmer'); kz = 1; while (getState("hm-rpc.1.001118A98B35E3.0.UNREACH").val == true || kz <= 10) { timeout = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B3947.4.LEVEL"/*Rollo_KUE:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B3947.4.LEVEL"/*Rollo_KUE:4.LEVEL*/, 0); } kz = kz + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B35E3.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Kinderzimmer'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Kinderzimmer'); } } // Badezimmer if (getState("hm-rpc.1.001118A98B35F7.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Badezimmer'); bz = 1; while (getState("hm-rpc.1.001118A98B35F7.0.UNREACH").val == true || bz <= 10) { timeout2 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B35F7.4.LEVEL"/*Rollo_BZ:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B35F7.4.LEVEL"/*Rollo_BZ:4.LEVEL*/, 0); } bz = bz + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B35F7.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Badezimmer'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Badezimmer'); } } // WC if (getState("hm-rpc.1.001118A98B37E3.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo WC'); wc = 1; while (getState("hm-rpc.1.001118A98B37E3.0.UNREACH").val == true || wc <= 10) { timeout3 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B37E3.4.LEVEL"/*Rollo_WC:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B37E3.4.LEVEL"/*Rollo_WC:4.LEVEL*/, 0); } wc = wc + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B37E3.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo WC'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo WC'); } } // Esszimmer links if (getState("hm-rpc.1.001118A98B382F.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Esszimmer links'); ezl = 1; while (getState("hm-rpc.1.001118A98B382F.0.UNREACH").val == true || ezl <= 10) { timeout4 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B382F.4.LEVEL"/*Rollo_EZ_links:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B382F.4.LEVEL"/*Rollo_EZ_links:4.LEVEL*/, 0); } ezl = ezl + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B382F.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Esszimmer links'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Esszimmer links'); } } // Hauswirtschaftsraum if (getState("hm-rpc.1.001118A98B3868.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Hauswirtschaftsraum'); hwr = 1; while (getState("hm-rpc.1.001118A98B3868.0.UNREACH").val == true || hwr <= 10) { timeout5 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B3868.4.LEVEL"/*Rollo_HWR:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B3868.4.LEVEL"/*Rollo_HWR:4.LEVEL*/, 0); } hwr = hwr + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B3868.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Hauswirtschaftsraum'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Hauswirtschaftsraum'); } } // Schlafzimmer if (getState("hm-rpc.1.001118A98B38B1.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Schlafzimmer'); sz = 1; while (getState("hm-rpc.1.001118A98B38B1.0.UNREACH").val == true || sz <= 10) { timeout6 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B38B1.4.LEVEL"/*Rollo_SZ:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B38B1.4.LEVEL"/*Rollo_SZ:4.LEVEL*/, 60); } sz = sz + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B38B1.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Schlafzimmer'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Schlafzimmer'); } } // Wohnzimmer if (getState("hm-rpc.1.001118A98B3906.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Wohnzimmer'); wz = 1; while (getState("hm-rpc.1.001118A98B3906.0.UNREACH").val == true || wz <= 10) { timeout7 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B3906.4.LEVEL"/*Rollo_WZ:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B3906.4.LEVEL"/*Rollo_WZ:4.LEVEL*/, 0); } wz = wz + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B3906.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Wohnzimmer'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Wohnzimmer'); } } // Yvonne´s Zimmer if (getState("hm-rpc.1.001118A98B390F.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Yvonne´s Zimmer'); yz = 1; while (getState("hm-rpc.1.001118A98B390F.0.UNREACH").val == true || yz <= 10) { timeout8 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B390F.4.LEVEL"/*Rollo_YZ:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B390F.4.LEVEL"/*Rollo_YZ:4.LEVEL*/, 0); } yz = yz + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B390F.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Yvonne´s Zimmer'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Yvonne´s Zimmer'); } } // Büro if (getState("hm-rpc.1.001118A98B3937.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Büro'); bu = 1; while (getState("hm-rpc.1.001118A98B3937.0.UNREACH").val == true || bu <= 10) { timeout9 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B3937.4.LEVEL"/*Rollo_BUE:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B3937.4.LEVEL"/*Rollo_BUE:4.LEVEL*/, 0); } bu = bu + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B3937.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Büro'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Büro'); } } // Küche if (getState("hm-rpc.1.001118A98B3947.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Küche'); ku = 1; while (getState("hm-rpc.1.001118A98B3947.0.UNREACH").val == true || ku <= 10) { timeout10 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B3947.4.LEVEL"/*Rollo_KUE:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B3947.4.LEVEL"/*Rollo_KUE:4.LEVEL*/, 0); } ku = ku + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B3947.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Küche'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Küche'); } } // Esszimmer rechts if (getState("hm-rpc.1.001118A98B3A5F.0.UNREACH").val == true) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung: Rollo Esszimmer rechts'); ezr = 1; while (getState("hm-rpc.1.001118A98B3A5F.0.UNREACH").val == true || ezr <= 10) { timeout11 = setTimeout(function () { if (getState("javascript.0.Rollo_Soll_Unten").val == false) { setState("hm-rpc.1.001118A98B3A5F.4.LEVEL"/*Rollo_EZ_rechts:4.LEVEL*/, 100); } else { setState("hm-rpc.1.001118A98B3A5F.4.LEVEL"/*Rollo_EZ_rechts:4.LEVEL*/, 0); } ezr = ezr + 1; }, 60000); } if (getState("hm-rpc.1.001118A98B3A5F.0.UNREACH").val == false) { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung behoben: Rollo Esszimmer rechts'); } else { setState("telegram.0.communicate.response"/*Send text through telegram*/, 'Störung nicht behoben: Rollo Esszimmer rechts'); } } });
Anbei noch ein Ausschnitt als Bild, da es sonst zu lang wird und sich die Blöcke eh wiederholen.
Ich hoffe auf eure Hilfe.
VIelen Dank & Gruß
Modjo
4811_blockly.jpg -
Hi
Ein Export von dem Script wäre besser. Da kann man besser "reparieren".
So auf die Schnelle: Mach mal aus dem "oder" ein "und".
Dann würde ich noch vor dem "ausführen timeout" ein "Stop timeout" setzen.
Grüße
-
Unabhängig von dem Skript wird Deine Wunschumsetzung nicht oder höchstens bedingt funktionieren.
"Unreach" bedeutet das die Kommunikation zwischen dem Aktor und der Zentrale gestört ist. In den seltensten Fällen wird diese Störung eigenständig aufgehoben. Wenn es sich bei den Roll-Aktoren nicht um HM-IP Geräte handelt, dann senden diese Geräte keine zyklischen Statusmeldungen. Aus diesem Grund kann "unreach" frühesten beim nächsten erfolgreichen Fahrbefehl bzw. der nächsten Statusmeldung durch manuelle Betätigung aufgelöst werden.
Handelt es sich um eine "echte" Verbindungsstörung so kann diese meist nur durch abstellen der Störeinflüsse und manueller Betätigung am Aktor beendet werden. Bei dieser Art der Verbindungsprobleme wäre das Skript erfolglos und würde sicher in einer Endlosschleife landen.
Kurzzeitige Verbindungsprobleme haben ihre Ursache meisten in einer falschen Programmierung der Abläufe. Es werden dann viele Funkbefehle gleichzeitig abgesetzt wobei es zu Funkkollisionen kommt und Schaltbefehle bzw. Rückantworten ihr Ziel nicht erreichen.
Verbindungsprobleme dieser Art durch ein Skript abfangen zu wollen ist sehr ungeschickt weil man lieber die Ursache statt der Symptome bekämpfen sollte.
-
Hi
Ein Export von dem Script wäre besser. Da kann man besser "reparieren".
So auf die Schnelle: Mach mal aus dem "oder" ein "und".
Dann würde ich noch vor dem "ausführen timeout" ein "Stop timeout" setzen.
Grüße `
Hi rantanplan,
ich werde nachher einmal deine Tipps einbauen und das Script exportieren.
@J Riemann:Unabhängig von dem Skript wird Deine Wunschumsetzung nicht oder höchstens bedingt funktionieren.
"Unreach" bedeutet das die Kommunikation zwischen dem Aktor und der Zentrale gestört ist. In den seltensten Fällen wird diese Störung eigenständig aufgehoben. Wenn es sich bei den Roll-Aktoren nicht um HM-IP Geräte handelt, dann senden diese Geräte keine zyklischen Statusmeldungen. Aus diesem Grund kann "unreach" frühesten beim nächsten erfolgreichen Fahrbefehl bzw. der nächsten Statusmeldung durch manuelle Betätigung aufgelöst werden.
Handelt es sich um eine "echte" Verbindungsstörung so kann diese meist nur durch abstellen der Störeinflüsse und manueller Betätigung am Aktor beendet werden. Bei dieser Art der Verbindungsprobleme wäre das Skript erfolglos und würde sicher in einer Endlosschleife landen.
Kurzzeitige Verbindungsprobleme haben ihre Ursache meisten in einer falschen Programmierung der Abläufe. Es werden dann viele Funkbefehle gleichzeitig abgesetzt wobei es zu Funkkollisionen kommt und Schaltbefehle bzw. Rückantworten ihr Ziel nicht erreichen.
Verbindungsprobleme dieser Art durch ein Skript abfangen zu wollen ist sehr ungeschickt weil man lieber die Ursache statt der Symptome bekämpfen sollte. `
Hi J Riemann,
es handelt sich tatsächlich um Homematic IP Aktoren (HmIP-BROLL). Der Fehler behebt sich häufig von selbst, wenn ich den Aktor über Level neu anspreche.
Ich schalte die Aktoren immer mit 1 Sekunde Versatz, also nicht gleichzeitig. Ich habe schon eine externe Antenne (https://www.stall.biz/project/externe-a … od-rpi-pcb) an meinem HM-MOD-RPI-PCB gelötet, was aber nur bedingt Abhilfe schafft. Ich schalte 11 Aktoren auf 2 Etagen (Einfamilienhaus, ca 130 qm insg.) Ich habe den RPi schon im OG möglichst mittig positioniert, aber manchmal sind die RSSI Werte gegen -70 bis -80
VG
-
Hi rantanplan,
ich habe deine Änderungen jetzt umgesetzt, ich hoffe so ist es richtig… ich werde es testen.
Den Export habe ich in eine Textdatei gepackt, da die Zeichen für einen Beitrag um ein Vielfaches überschritten wird.
VG
-
Hi Zusammen,
ich habe es noch einmal abgeändert getestet, der RPi3 stürzt immer noch ab und in dem Logfile steht immer noch:
2018-09-18 18:32:51.807 - error: hm-rpc.1 xmlrpc -> setValue ["4","LEVEL",0.25] FLOAT
2018-09-18 18:32:51.809 - error: hm-rpc.1 Error: XML-RPC fault: Generic error ( DUTY_CYCLE)
-
Mit wiederhole solange werden unmittelbar hintereinander Timer gestartet und es wird im ms-Abstand an die Rollos gesendet.
Du möchtest vermutlich im Minutenabstand senden, solange UNREACH noch wahr ist ? Dafür verwendet man Ausführen Intervall alle 1 Minute zusammen mit stop zyklische Ausführung Intervall, wenn UNREACH false oder die max. Anzahl erreicht ist.
-
Verwende besser für jedes UNREACH einen eigenen Trigger, da die einzelnen Rollos ohnehin individuell behandelt werden. Etwa so:
-
Verwende besser für jedes UNREACH einen eigenen Trigger, da die einzelnen Rollos ohnehin individuell behandelt werden. Etwa so:
Blockly_UNREACH_10xSenden.JPG `
Hallo paul53,
so?
Oder ist das falsch?
Vielen Dank & Gruß
Modjo
-
Oder ist das falsch? `
ja, das Triggern auf "ist wahr" verhindert, dass der sonst-Zweig der Abfrage jemals erreicht wird. Der Rest sollte funktionieren. -
Hi,
sorry, die Rückmeldung kommt sehr spät, aber wie oben beschrieben funktioniert es dann.
Vielen Dank nochmal.
VG
Modjo