NEWS
Temperatursteuerung zuverlässiger gestalten
-
Guten Morgen alle Zusammen,
ich habe bei mir eine mit ZigBee und GPIO gesteuerte Temperaturregelung die öfters mal nicht so zuverlässig läuft.
Die ZigBee Sensoren nehmen die Raumtemperatur auf und Steuern damit die GPIO I/O, was vom Skript auch soweit ganz gut läuft. Aber der GPIO wird gesetzt in der Software aber die Hardware führt das öfters mal nicht aus. Obwohl er gesetzt sein sollte. Woran kann das liegen, was kann ich dagegen tun ? Gibt es eine weitere Statusabfrage?
Das wäre mein Skript.
var FBH, Temperatur; FBH = getState("rpi2.0.gpio.10.state").val; on({id: "zigbee.0.00158d0007ed72a2.temperature"/*Temperature*/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("rpi2.0.temperature.soc_temp").val > 20) { Temperatur = parseFloat((obj.state ? obj.state.val : "")) + 0.4; if (Temperatur <= 21.4) { FBH = false; } else if (Temperatur >= 22) { FBH = true; } } else { FBH = true; } if (FBH != getState("rpi2.0.gpio.10.state").val) { setState("rpi2.0.gpio.10.state"/*GPIO 10*/, FBH); } console.log((['Temperatur :',Temperatur,'°C , FBH :',FBH].join(''))); });
Vielen Dank für event. Verbesserungen
-
@zimbl sagte: die Hardware führt das öfters mal nicht aus.
Bleibt der GPIO-Wert dann unbestätigt?
Man kann Wiederholungen von setState() mit verschiedenen Zeitabständen (z.B. 1 s, 5 s) vorsehen, die gestoppt werden, wenn der gesendete Wert bestätigt wird.var Temperatur, timer1, timer5; const idFBH = 'rpi2.0.gpio.10.state' ; var FBH = getState(idFBH).val; on('zigbee.0.00158d0007ed72a2.temperature', function (obj) { var value = obj.state.val; if (getState("rpi2.0.temperature.soc_temp").val > 20) { Temperatur = parseFloat(value) + 0.4; if (Temperatur <= 21.4) { FBH = false; } else if (Temperatur >= 22) { FBH = true; } } else { FBH = true; } if (FBH != getState(idFBH).val) { setState(idFBH, FBH); timer1 = setTimeout(function() { setState(idFBH, FBH); }, 1000); timer5 = setTimeout(function() { setState(idFBH, FBH); }, 5000); } console.log((['Temperatur: ',Temperatur,'°C , FBH: ',FBH ? 'Aus' : 'Ein'].join(''))); }); on({id: idFBH, ack: true}, function(dp) { if(dp.state.val == FBH) { clearTimeout(timer1); clearTimeout(timer5); } });
-
Vielen Dank Paul. Ich werde das mal testen und halte dich da auf dem laufenden.
-
so ich habe das jetzt mal beobachtet, irgendwo liegt noch ein Fehler...?!?!?!
Ich habe im Raum nun über 23 Grad...aber mein GPIO stand eben schon wieder auf FALSE...Wenn die Temperatur erreicht ist, sollte er auf TRUE stehen....
Also im Protokoll war vermerkt FBH:AUS
-
@zimbl sagte: mein GPIO stand eben schon wieder auf FALSE... im Protokoll war vermerkt FBH:AUS
Dann hast du wohl ein anderes Problem, das nichts mit dem Skript zu tun hat.
-
fehlt im neuen Skript nicht diese Funktion "async function (obj)" ?
Weil wenn ZIGBEE sagt FALSE soll ja der GPIO TRUE sagen...
oder stehe ich jetzt auf der Leitung ?
-
@zimbl sagte: fehlt im neuen Skript nicht diese Funktion "async function (obj)" ?
Nein, "async" wird hier nicht benötigt. Du siehst ja an der Logausgabe, dass der richtige Wert gesendet wird.
Mach mal aus dem unteren Trigger ein Debug-Log:on({id: idFBH}, function(dp) { const from = dp.state.from.startsWith('system.adapter.javascript.') ? dp.state.c : dp.state.from; log('FBH: ' + dp.state.val ? 'Aus' : 'Ein' + ', bestätigt: ' + dp.state.ack + ', Quelle: ' + from); if(dp.state.val == FBH && dp.state.ack) { clearTimeout(timer1); clearTimeout(timer5); } });
-