NEWS
Rechnen mit Variablen in Blockly
-
kann man mit Variablen in Blockly eigentlich nicht rechnen?
Ich versuche mich gerade an einem für meine Verhältnisse fortgeschrittenen Programm. Hier will ich mit Variablen arbeiten:
Für @paul53 auch als Text:
var Verbrauch, Alter_Wert, Solltemperatur; Verbrauch = 0; Alter_Wert = 0; Solltemperatur = 24.1; on({id: new RegExp('hm-rega\\.0\\.54003' + "|" + 'hm-rpc\\.0\\.JRT0001572\\.1\\.STATE' + "|" + 'hm-rpc\\.0\\.JEQ0064523\\.1\\.TEMPERATURE'), change: "ne"}, function (obj) { if (getState("hm-rega.0.54003").val > (obj.oldState ? obj.oldState.val : "")) { console.log('Heizung angeschaltet!'); Alter_Wert = getState("hm-rpc.0.NEQ0384904.2.ENERGY_COUNTER").val; } else if (getState("hm-rega.0.54003").val == true && getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val < Solltemperatur - 0.2 && getState("hm-rpc.0.JRT0001572.1.STATE").val == 0) { setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, true); console.log((['Temperatur soll: ',Solltemperatur,', Temperatur ist: ',getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val].join(''))); } else if (getState("hm-rega.0.54003").val == true && (getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val >= Solltemperatur + 0.2 || getState("hm-rpc.0.JRT0001572.1.STATE").val != 0)) { setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, false); console.log((['Temperatur soll: ',Solltemperatur,', Temperatur ist: ',getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val].join(''))); } else if (getState("hm-rega.0.54003").val == false) { setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, false); Verbrauch = getState("hm-rpc.0.NEQ0384904.2.ENERGY_COUNTER").val - Alter_Wert; console.log(('Stromverbrauch: ' + String(Verbrauch))); } });
Die Heizung soll nach den eingegebene Werten schlten, leider schaltet sie in meinen Augen immer zu früh. (An schon bei 23.9 und aus bei 24.1)
Daraufhin habe ich mir die Debug-Bausteine eingebaut und prompt war die letzte Schaltung korrekt, was aber nichts heißen muss wenn der Wert einfach zu schnell fäält/steigt:EDIT: so soll er nicht schalten, um 2019-05-26 21:29:25.576 sprang die Heizung an:
javascript.0 2019-05-26 21:29:25.576 info script.js.Wetter_und_Klima.Badheizung: Temperatur soll: 24.1, Temperatur ist: 23.9 javascript.0 2019-05-26 21:12:31.485 info script.js.Wetter_und_Klima.Badheizung: Temperatur soll: 24.1, Temperatur ist: 24.4 javascript.0 2019-05-26 21:09:45.472 info script.js.Wetter_und_Klima.Badheizung: Temperatur soll: 24.1, Temperatur ist: 24.5 javascript.0 2019-05-26 21:08:24.268 info script.js.Wetter_und_Klima.Badheizung: Heizung angeschaltet!
Im Text-Output würde ich Klammern setzen:
statt
getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val < Solltemperatur - 0.2
würde ich schreiben
getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val < (Solltemperatur - 0.2)
Ist das der Grund?
Dann müsste ich wahrscheinlich vorab noch zwei weitere Variablen "Obergrenze" und "Untergrenze" definieren und dort direkt die Differenz bilden, oder?Danke für Hilfe
-
@Homoran sagte:
Ist das der Grund?
Nein, Klammern sind nicht erforderlich (Priorisierung). Javascript ist nicht HM Script.
Was soll der Vergleich: Wert von Bad_heizen > vorheriger Wert bei 3 Triggerdatenpunkten ? Woher soll der Vergleich wissen, wer gerade getriggert hat ?
-
@paul53 sagte in Rechnen mit Variablen in Blockly:
Woher soll der Vergleich wissen, wer gerade getriggert hat ?
Da gebe ich dir Recht! Aber das ist nicht das Problem, das hat seltsamerweise immer funktioniert.
Dieser Block sollte nur wenn die Sysvar erstmalig von false auf true geht wirken.
Dann muss ich das mal mit einer weiteren Variable "erstmalig" versuchenDanke
PS habe gerade noch ein zweites Programm gefunden, von dem ich gar nicht wusste, dass ich es habe. muss mal sehen ob das gestört hat
-
Es scheint so als seien die Funktionen "kleiner/größer" und "kleiner/größer gleich" vertauscht, Die Heizung schaltet schon bei 0,2 Differenz an, obwohl da <Wert-2 steht und umgekehrt bei Wert+2 noch nicht ab, obwohl dort größer gleich steht.
Ansonsten scheint alles zu Laufen, hier noch mal das Blockly (obere Hälfte)
und der Quelltext:
var erstmalig, Verbrauch, Alter_Wert, Solltemperatur; erstmalig = false; Verbrauch = 0; Alter_Wert = 0; Solltemperatur = 24.1; on({id: new RegExp('hm-rega\\.0\\.54003' + "|" + 'hm-rpc\\.0\\.JRT0001572\\.1\\.STATE' + "|" + 'hm-rpc\\.0\\.JEQ0064523\\.1\\.TEMPERATURE'), change: "ne"}, function (obj) { if (getState("hm-rega.0.54003").val == true && erstmalig == false) { erstmalig = true; console.log('Heizung angeschaltet!'); Alter_Wert = getState("hm-rpc.0.NEQ0384904.2.ENERGY_COUNTER").val; } else if (getState("hm-rega.0.54003").val == true && getState("hm-rpc.0.NEQ0384904.1.STATE").val == false && getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val < Solltemperatur - 0.2 && getState("hm-rpc.0.JRT0001572.1.STATE").val == 0) { setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, true); console.log((['Untergrenze! ','Temperatur soll: ',Solltemperatur,', Temperatur ist: ',getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val].join(''))); } else if (getState("hm-rega.0.54003").val == true && getState("hm-rpc.0.NEQ0384904.1.STATE").val == true && (getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val >= Solltemperatur + 0.2 || getState("hm-rpc.0.JRT0001572.1.STATE").val != 0)) { setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, false); console.log((['Obergrenze! ','Temperatur soll: ',Solltemperatur,', Temperatur ist: ',getState("hm-rpc.0.JEQ0064523.1.TEMPERATURE").val].join(''))); } else if (getState("hm-rega.0.54003").val == false) { setState("hm-rpc.0.NEQ0384904.1.STATE"/*Badheizung:1.STATE*/, false); Verbrauch = getState("hm-rpc.0.NEQ0384904.2.ENERGY_COUNTER").val - Alter_Wert; erstmalig = false; console.log(('Stromverbrauch: ' + String(Verbrauch))); } });
Ist das ein bekanntes Issue mit > / >= ?
-
@Homoran sagte:
Ist das ein bekanntes Issue mit > / >= ?
Nein, das funktioniert.
Was ist Griff Bad ? Damit hast Du eine Oder-Verküpfung:
Temperatur >= Soll + 0,2 ODER Wert Griff bad != 0 -
@Homoran Vorschlag (verkürzt):
-
@paul53 sagte in Rechnen mit Variablen in Blockly:
Was ist Griff Bad ?
Das ist der Fensterdrehgriffsensor. Wenn ich mach dem Baden das Fenster öffne und vergesse dass die Heizung eigentlich noch läuft, soll sie icht die Straße heizen, wenn die Temperatur fällt.
@paul53 sagte in Rechnen mit Variablen in Blockly:
Nein, das funktioniert.
Klar funktioniert es, nur vertauscht >= hat anscheinend die Funktion von > und umgekehrt. (Bei < ebenso).
@paul53 sagte in Rechnen mit Variablen in Blockly:
(verkürzt)
Hätte mich auch gewundert, wenn da nicht noch von dir etwas optimiertes käme
Seh ich mir an! Danke!Edit
Erster Eindruck: Die Verbrauchsberechnung ist raus. -
@Homoran sagte:
Die Verbrauchsberechnung ist raus.
Alter Wert kann man sich nicht in einer Variablen merken, denn deren Wert überlebt keinen Neustart vom Skript / Adapter / ioBroker / OS. Dafür benötigt man einen Datenpunkt.
Wenn ich Blockly programmieren würde, würde es etwa so aussehen:
Die Datenpunkt-Zuordnung ergibt sich aus den Variablennamen.
-
@paul53 sagte in Rechnen mit Variablen in Blockly:
Die Datenpunkt-Zuordnung ergibt sich aus den Variablennamen.
Klar, kein Problem
@paul53 sagte in Rechnen mit Variablen in Blockly:
Alter Wert kann man sich nicht in einer Variablen merken, denn deren Wert überlebt keinen Neustart vom Skript / Adapter / ioBroker / OS.
Ist in diesem Fall nicht ganz so schlimm, da die Berechnungsfunktion ja nur etw 2-3 Stunden halten muss.
Das Bad hat leider eine Unterdeckung im Wärmebedarf und ich schlate vor dem Baden immer die Zusatzheizung an, damit sich die Wände ein wenig aufwärmen und nicht so viel Kondenswasser bildet.
Jetzt soll das Bad renoviert werden und evtl. eine Infrarotheizung mit eingebaut werden. Ich würde gerne mal abschätzen welche Leistung diese haben müsste, wenn sie dauernd (mit so einem Programm gesteuert) läuft.Sinn DIESES Programms ist:
- Taster im Bad drücken
- Sysvar "Bad_heizen" wird auf true gesetzt
- Heizung läuft im angegebenen Temperaturbereich intervallweise
- Nach dem Baden sollte ich die Heizungsbereitschaft über den Taster wieder abschalten.
- SysVar wird auf false gesetzt
- Sollte ich das vergessen, weill die Heizung gerade in Standby steht und ich das Fenster öffnen, soll sie natürlich nicht die nächste Stunde bei offenenm Fenster laufen
- jetzt neu: zum Abschluss hätte ich gerne die verbrauchte Energie
@paul53 sagte in Rechnen mit Variablen in Blockly:
Wenn ich Blockly programmieren würde,
Ich weiß, aber ich bin noch nicht so weit für pure js
@paul53 sagte in Rechnen mit Variablen in Blockly:
würde es etwa so aussehen:
Da muss ich mich mal reinarbeiten. Funktionen wollte ich immer schon lernen.
Nochmals besten Dank!
-
@Homoran
Of topic. Fast.
baulich gesehen, ohne jetzt wem vorwegnehmen oder belehren zu wollen, würde ich bei einer Renovierung, anstatt einer Infrarotheizung eher eine Wandheizung a la Fußbodenheizung installieren. Und die dann Steuern. Is nicht sichtbar und hat aber trotzdem die gewünschte Funktion.
Hab ich bei mir, im Bad, inkl. Spiegelheizung. Leider noch vor dem iobroker Projekt realisiert... Daher nicht geregelt, aber echt praktisch.... -
@Rababersaft
Da hatte ich auch schon drüber nachgedacht.
Dazu müsste aber ausreichend Wand vorhanden sein in der keine Anschlüsse liegen.
Spiegelheizung bei einem 3,5 qm großen spiegel hab ich auch schon drüber nachgedacht.Warum meinst du hat das Bad diese Unterdeckung?
Fußbodenheizung bei 5qm Raum reicht halt nicht. Das sind 12,5 cbm raumAndererseits ist es keine große Renovierung. Lediglich die Badewanne soll einer großen Dusche weichen um das Bad für das Alter das unaufhörlich näherkommt vorzubereiten.
-
@Homoran sagte in Rechnen mit Variablen in Blockly:
Warum meinst du hat das Bad diese Unterdeckung?
Fußbodenheizung bei 5qm Raum reicht halt nicht. Das sind 12,5 cbm raumHmmm, ich meinte, das es am schönsten ist mit ner Wandheizung. Man kann es fühlen wenn man in den Raum kommt (kann auch sein dass es Einbildung ist). Und, evtl nicht ganz unerheblich, verschiebt man dadurch den Taupunkt weiter nach außen.
(Hab ein alleinstehendes Haus...)
Daher war damals, bei meiner Renovierung, die Überlegung nicht weit, die Wände auch gleich mit zu bearbeiten. Freu nach dem Motto: wenn ich schon mal dabei bin...(Aber jetzt sind wir Off topic)