NEWS
Skript (Zisternenfüllstandsanzeige) funzt nicht..
-
Hallo zusammen,
ich bin recht unerfahren mit Skripten und Blockly. Habe zwar schon ein paar Blocklys zusammengebaut, komme aber mit dem derzeitigen Problem nicht weiter (Suche hat auch nicht ergeben).
Ich habe mir eine Zisternenfüllstandsanzeige gekauft (Zisternensteuerung.de) mit einer Auswertung auf ein Hutschienenmodul, von dort per Funk weiter an die CCU3. Auswertung im Hutschienenmodul funktioniert, Funkmodul in der CCU3 angelernt, zeigt auch die Füllstände im Gerätestatus an den Kanälen 5-8 richtig an (als Einzelbit). Nur das Skript zur Berechnung des Pegels in % aus den Einzelbits mit ihren Dezimalwerten und der Summation funktioniert nicht.
Hier das Skript:
!2020 copyright tne-systeme UG (haftungsbeschraenk) und Uwe Voigt !Definitionen object BCD_D = datapoints.Get("HmIP-MOD-RC8 001460C9ABA6A1:5.STATE"); object BCD_C = datapoints.Get("HmIP-MOD-RC8 001460C9ABA6A1:6.STATE"); object BCD_B = datapoints.Get("HmIP-MOD-RC8 001460C9ABA6A1:7.STATE"); object BCD_A = datapoints.Get("HmIP-MOD-RC8 001460C9ABA6A1:8.STATE"); object Level =dom.GetObject('ZisternePegel_Prozent'); object Fehler =dom.GetObject('Zisterne_Fehler'); object Ueberlauf =dom.GetObject('Zisterne_Ueberlauf'); object Aus =dom.GetObject('Zisterne_Aus'); object noPegel =dom.GetObject('Zisterne_keinPegel'); !Füllstanddecodierung if ((BCD_D.Value()) && (BCD_C.Value()) && (BCD_B.Value()) && (BCD_A.Value())) {Level.State(0);} if ((!BCD_D.Value()) && (!BCD_C.Value()) && (!BCD_B.Value()) && (!BCD_A.Value())) {Level.State(0);} if ((!BCD_D.Value()) && (!BCD_C.Value()) && (BCD_B.Value()) && (!BCD_A.Value())) {Level.State(0);} if ((BCD_D.Value()) && (BCD_C.Value()) && (BCD_B.Value()) && (!BCD_A.Value())) {Level.State(10);} if ((BCD_D.Value()) && (BCD_C.Value()) && (!BCD_B.Value()) && (BCD_A.Value())) {Level.State(20);} if ((BCD_D.Value()) && (BCD_C.Value()) && (!BCD_B.Value()) && (!BCD_A.Value())) {Level.State(30);} if ((BCD_D.Value()) && (!BCD_C.Value()) && (BCD_B.Value()) && (BCD_A.Value())) {Level.State(40);} if ((BCD_D.Value()) && (!BCD_C.Value()) && (BCD_B.Value()) && (!BCD_A.Value())) {Level.State(50);} if ((BCD_D.Value()) && (!BCD_C.Value()) && (!BCD_B.Value()) && (BCD_A.Value())) {Level.State(60);} if ((BCD_D.Value()) && (!BCD_C.Value()) && (!BCD_B.Value()) && (!BCD_A.Value())) {Level.State(70);} if ((!BCD_D.Value()) && (BCD_C.Value()) && (BCD_B.Value()) && (BCD_A.Value())) {Level.State(80);} if ((!BCD_D.Value()) && (BCD_C.Value()) && (BCD_B.Value()) && (!BCD_A.Value())) {Level.State(90);} if ((!BCD_D.Value()) && (BCD_C.Value()) && (!BCD_B.Value()) && (BCD_A.Value())) {Level.State(100);} !Fehlerdecodierung Fehler.State( (!BCD_D.Value()) && (!BCD_C.Value()) && (!BCD_B.Value()) && (BCD_A.Value())); Ueberlauf.State( (!BCD_D.Value()) && (BCD_C.Value()) && (!BCD_B.Value()) && (!BCD_A.Value())); Aus.State( (!BCD_D.Value()) && (!BCD_C.Value())&& (!BCD_B.Value()) && (!BCD_A.Value())); noPegel.State( (!BCD_D.Value()) && (!BCD_C.Value()) && (BCD_B.Value()) && (!BCD_A.Value()));
MOD-EDIT: Code in code-tags gesetzt!
Kann einer von euch sehen wo der Fehler liegt? Weitere Frage, wie kann man dieses Skript in den ioBroker (als Blockly?) übernehmen und dort direkt die Daten auswerten zur Anzeige im VIS (einfach neues Skipt aufmachen und reinkopieren gibt bei mir ne Fehlermeldung)?
Der Verkäufer ist gewillt das Problem zu lösen, hat aber gerade nicht die Homematik Bauteile vorrätig um zu testen...und ich bin ungeduldig:-)Danke euch Det
-
@det-le Als erstes fehlt in dem Script ein 'Trigger*, der erkennt ob sich einer der Werte a,b,c,d ändert.
Ich habe dein script mal in eine übersichtliche Form gebracht und die Binärwerte in Zahlenwerten dargestellt.
Signallogik.txt
Im user.0 habe ich die boolean Datenpunkte A, B, C, D angelegt und danach folgendes script erstellt.
Zisterne.txtDas umwandeln von boolean -> Zahl geht evtl. eleganter, aber auf die Schneller funktioniert es erstmal.
-
@geschild Vielen Dank für die Unterstützung, jetzt steh ich echt aufm Schlauch....
Ich habe dein Blockly genommen und im ioBroker als Blockly importiert. Unter Objekt A-D habe ich die ID vom Funkmodul der Kanäle 5-8 hinterlegt:
Weiter unten habe ich wieder die ID's der Kanäle 5-8 hinterlegt.
strikethrough textAber, unter Userdata 0 finde ich keine Datenpunkte A-D oder andere Datenpunkte die mir den Füllstand oder die anderen Daten anzeigen. Hab grad keinen Plan wo ich die Daten finden/sehen kann.
Skript in der CCU klappt auch nicht, alle Variablen bleiben auf 0, bzw. false. Prio hat für mich aber die Lösung im ioBroker..
Det
-
@geschild sagte: übersichtliche Form gebracht
Danach sieht die Logik für mich so aus:
Die zu schreibenden Datenpunkte sind sicherlich Systemvariablen in der Instanz "hm-rega.0"
-
@det-le Die Datenpunkte A-D im user0 habe ich von Hand angelegt, um die Funktion zu simulieren.
Das Ergebnis der Auswertung habe ich auf debug-Blocklys gelegt, somit sollte das Ergebnis unten angezeigt werden.
Zum Einlesen der Zustände verwende bitte das script von Paul53 1. Kürzer 2. Beinhaltet es die Umsetzung negative-> positive Logik.
-
OK, vielen Dank. Ich komme erst am Dienstag dazu mir das genauer anzuschauen. Ich werde berichten...
-
So,
sorry, hat etwas gedauert. Hier nun ein funktionierendes Script für den IO-Broker. Habe es bei mir im Einsatz und es tut was es soll. Man kann es bestimmt noch optimieren, ich kann so aber jeden Schritt nachvollziehen und auch verstehen. Daher ist das für mich Laien sehr gut geeignet.
var Fuellstand; on({ id: [].concat(['hm-rpc.2.001460C9ABA6A1.5.STATE']).concat(['hm-rpc.2.001460C9ABA6A1.6.STATE']).concat(['hm-rpc.2.001460C9ABA6A1.7.STATE']).concat(['hm-rpc.2.001460C9ABA6A1.8.STATE']), change: 'ne' }, async (obj) => { setState('0_userdata.0.Zisterne.A' /* A */, getState('hm-rpc.2.001460C9ABA6A1.5.STATE').val, true); setState('0_userdata.0.Zisterne.B' /* B */, getState('hm-rpc.2.001460C9ABA6A1.6.STATE').val, true); setState('0_userdata.0.Zisterne.C' /* C */, getState('hm-rpc.2.001460C9ABA6A1.7.STATE').val, true); setState('0_userdata.0.Zisterne.D' /* D */, getState('hm-rpc.2.001460C9ABA6A1.8.STATE').val, true); Fuellstand = 0; Fuellstand = (typeof Fuellstand === 'number' ? Fuellstand : 0) + (getState('hm-rpc.2.001460C9ABA6A1.8.STATE').val ? 0 : 10); Fuellstand = (typeof Fuellstand === 'number' ? Fuellstand : 0) + (getState('hm-rpc.2.001460C9ABA6A1.7.STATE').val ? 0 : 20); Fuellstand = (typeof Fuellstand === 'number' ? Fuellstand : 0) + (getState('hm-rpc.2.001460C9ABA6A1.6.STATE').val ? 0 : 40); Fuellstand = (typeof Fuellstand === 'number' ? Fuellstand : 0) + (getState('hm-rpc.2.001460C9ABA6A1.5.STATE').val ? 0 : 80); setState('0_userdata.0.Zisterne.Fuellstand' /* Fuellstand */, Fuellstand); setState('0_userdata.0.Zisterne.Ueberlauf' /* Ueberlauf */, false); setState('0_userdata.0.Zisterne.Kein_Pegel' /* Kein Pegel */, false); setState('0_userdata.0.Zisterne.Fehler' /* Fehler */, false); setState('0_userdata.0.Zisterne.Aus' /* Aus */, false); if (Fuellstand == 110) { setState('0_userdata.0.Zisterne.Ueberlauf' /* Ueberlauf */, true); } if (Fuellstand == 130) { setState('0_userdata.0.Zisterne.Kein_Pegel' /* Kein Pegel */, true); } if (Fuellstand == 140) { setState('0_userdata.0.Zisterne.Fehler' /* Fehler */, true); } if (Fuellstand == 150) { setState('0_userdata.0.Zisterne.Aus' /* Aus */, true); } }); Das Script für die CCU3 habe ich noch nichts ans laufen gebracht. Da muss ich bei Gelegenheit noch mal ran.