NEWS
Blockly mit Bedingung und schedule
-
Eh was funktioniert mit Mathe oder Text Block ?
Er kam doch mit dem Mathe Block immer in die oder Schleife?
–-----------------------
Send from mobile device
-
Diese Regenerkennungs-Blockly funktioniert mit dem gleichen Trigger und dem Wert von als Mathe Block (Ansagen und Lichtänderung ist korrekt ausgeführt)
Das Regenintensität-Blockly funktioniert anscheinend nicht mit der selben Trigger / falls Kombination
Der debug-Block "ist getriggert" wird noch ausgelöst, dann kommt nichts mehr :?:
Gruß
Rainer
-
Das Regenintensität-Blockly funktioniert anscheinend nicht mit der selben Trigger / falls Kombination `
meine glaskugel geht gerade nicht, wo ist dein Regenintensität-Blockly ?
-
meine glaskugel geht gerade nicht, wo ist dein Regenintensität-Blockly ? `
um das geht es eigentlich die Ganze Zeit:http://forum.iobroker.net/posting.php?m … 87#pr88873
Habe inzwischen ganz unten noch einen debug-Block drangehängt, der mir den Wert des regensensor States ausgibt.
javascript.0 2017-10-08 16:10:03.336 info script.js.Regenintensitaet: Check - fertig javascript.0 2017-10-08 16:10:03.336 info script.js.Regenintensitaet: Der Zustand vom Regensensor ist: 0
(Im Moment regnet es mal wieder nicht)
Gruß
Rainer
-
meine glaskugel geht gerade nicht, wo ist dein Regenintensität-Blockly ? `
um das geht es eigentlich die Ganze Zeit:http://forum.iobroker.net/posting.php?m … 87#pr88873
Habe inzwischen ganz unten noch einen debug-Block drangehängt, der mir den Wert des regensensor States ausgibt.
javascript.0 2017-10-08 16:10:03.336 info script.js.Regenintensitaet: Check - fertig javascript.0 2017-10-08 16:10:03.336 info script.js.Regenintensitaet: Der Zustand vom Regensensor ist: 0
(Im Moment regnet es mal wieder nicht)
Gruß
Rainer `
hast du meinen block als vorschlag mal probiert ? Also nicht wiederhohle sondern interval
-
Noch nicht!
Wollte es erst mit meiner Version testen. Ich denke der Fehler liegt woanders. Wenn du mir erklären kannst, warum in meiner Version der debug-block "es regnet" nicht ausgeführt wird wären ich schon ein Stück weiter.
Selbst wenn der wiederhole-Block nicht funktioniert hätte doch der debug-Block "es regnet" ausgegeben werden müssen, ODER?
Gruß
Rainer
-
Selbst wenn der wiederhole-Block nicht funktioniert hätte doch der debug-Block "es regnet" ausgegeben werden müssen, ODER? `
jup, verstehe ich auch nicht warum er fuer die ansagen geht aber nicht fuer den block mit berechnungen er ist ja gleich.
DUe koennste mal zum spass den wert in eine variable schreiben und dan die variable als debug block auslesen vielleicht war er doch was anderes als 1 zu de zeitpunkt?
-
Nachdem keiine Meldungen mehr im Blockly-log kamen und nach neustart des javascript-Adapters Error code7 already running kam, habe ich mir über die Konsole mit top die Prozesse angesehen.
Sobald ich den Block mit falls… unten angehängt hatte, damit er immer läuft stieg der Adapter mit 100% CPU aus.
Da muss ich erst mal nachdenken warum.
Deine Version scheint keine Probleme zu machen.
...waiting for rain again.
Rainer
-
Bei dem nächsten Regen lief die neue Version nahezu komplett.
nur nach dem Regen hörte sie nicht mehr auf mit dem "Auführen Intervall"
Ich hatte das "sonst - clear interval" vergessen :oops:
Warum der Wert in Liter / Minute immer auf 0 stand??
Ich logge jetzt die Werte mal.
insgesamt fielen 0,3mm Regen - nicht viel aber >0!
Warum meine Version den js-Adapter an die Kapazitätsgrenzen brachte habe ich noch nicht herausbekommen.
Danke für die Hilfe
Rainer
-
Warum meine Version den js-Adapter an die Kapazitätsgrenzen brachte habe ich noch nicht herausbekommen. `
Wenn Du den Javascript-Code (in Code-Tags) postest, kann Dir vielleicht geholfen werden. -
Hallo Paul,
ich hoffe ich habe ihn wieder vollständig rekonstruiert:
on({id: 'hm-rpc.0.KEQ1022589.1.STATE', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; console.log('ist getriggert'); if (getState("hm-rpc.0.KEQ1022589.1.STATE").val == 1) { console.log('es regnet'); while (!(getState("hm-rpc.0.KEQ1022589.1.STATE").val == 0)) { schedule("*/3 * * * *", function () { setState("Messwerte.0.Wetterdaten.Regenintensitaet"/*Regenintensitaet*/, ((getState("hm-rpc.0.JEQ0140901.1.RAIN_COUNTER").val - getState("Messwerte.0.Wetterdaten.Regenmenge_alt").val) / 3), true); setStateDelayed("Messwerte.0.Wetterdaten.Regenmenge_alt"/*Regenmenge_alt*/, getState("hm-rpc.0.JEQ0140901.1.RAIN_COUNTER").val, true, 200, false); console.log((String('Die Regenmenge der letzten drei Minuten betrug: ') + String(getState("hm-rpc.0.JEQ0140901.1.RAIN_COUNTER").val - getState("Messwerte.0.Wetterdaten.Regenmenge_alt").val))); }); } console.log('es regnet nicht mehr'); } console.log('es regnet nicht'); }); console.log('Check - fertig'); console.log((String('Der Zustand vom Regensensor ist: ') + String(getState("hm-rpc.0.KEQ1022589.1.STATE").val)));
(in Code-Tags) `
Das ist der code, den Blockly ausspuckt.
Gruß
Rainer
-
while (!(getState("hm-rpc.0.KEQ1022589.1.STATE").val == 0))
erzeugt den Dauerstress solange es regnet (Wert > 0). Eine Änderung des Wertes triggert erneut. Also nur
if(value) { timer = schedule(...) } else { clearSchedule(timer); }
console.log('Check - fertig'); console.log((String('Der Zustand vom Regensensor ist: ') + String(getState("hm-rpc.0.KEQ1022589.1.STATE").val)));
wird nur einmal beim Skriptstart ausgeführt.
if (getState("hm-rpc.0.KEQ1022589.1.STATE").val == 1) {
Es ist besser mit der Skriptvariablen value zu arbeiten (weniger CPU-Last)
if (value == 1) {
Ein getState(id) auf die ID, mit der getriggert wurde, sollte man vermeiden.
-
Danke Paul,
das muss ich erst mal verdauen und sehen, wie ich das in Blockly umsetzen kann.
Danke
Rainer
-
Danke Paul,
das muss ich erst mal verdauen und sehen, wie ich das in Blockly umsetzen kann.
Danke
Rainer `
Ich glaube was Paul da schreibt is genau mein Beispiel?
Nur triggern auf regen ja nein und den Intervall ausschalten wen es nicht mehr regnet
–-----------------------
Send from mobile device
-
Das folgende Blockly sollte das erledigen, was Du möchtest ?
Anmerkung: Mit Blockly dauert es bei mir mind. 5 mal solange als wenn ich es in Javascript eintippe. -
Das folgende Blockly sollte das erledigen, was Du möchtest ?
Regenintensität.JPG
Anmerkung: Mit Blockly dauert es bei mir mind. 5 mal solange als wenn ich es in Javascript eintippe. `
genauso war mein erster vorschlag auf, Rainer moechte die berechnung aber nur laufen lassen wen es regnet daher war mein vorschlag das ueber einen interval zu loesen der getriggert wird durch true/false stand des regensensors.
Wie ist deine meinung dazu Paul ?
-
Mit Blockly dauert es bei mir mind. 5 mal solange als wenn ich es in Javascript eintippe. `
Sorry Paulich versuche mich so an js heranzu tasten.
Die Logik ist der erste Schritt, die Befehle (und Struktur) der zweite.
Bin jetzt ein paar Tage weg, werde baldmöglichst testen. Habe im Moment die Version mit interval. Mal sehen wann es wieder regnet.
Danke für eure Hilfe
Rainer
PS gibt es eigentlich (ähnlich zu Homematic) einen Trigger, der auf einen Wert im DP reagiert? - Wenn Leistung > 50W dann mache… oder muss man auf Änderung (Erhöhung) triggern und dann den falls... Block nehmen?
-
PS gibt es eigentlich (ähnlich zu Homematic) einen Trigger, der auf einen Wert im DP reagiert? - Wenn Leistung > 50W dann mache… oder muss man auf Änderung (Erhöhung) triggern und dann den falls... Block nehmen?
mit blockly nein da geht nur "hoeher als voriger, kleiner als voriger , ist true, ist false usw".
Mit script geht es glaube ich wohl siehe pattern:
on(pattern, callbackOrId, value)
wobei man in dem "value" logic verarbeiten kan
-
gibt es eigentlich (ähnlich zu Homematic) einen Trigger, der auf einen Wert im DP reagiert? - Wenn Leistung > 50W dann mache `
Ja.on({id: idLeistung, valGt: 50, oldValLe: 50} function(dp) {...}); ````~~@Dutchman:~~ > Rainer moechte die berechnung aber nur laufen lassen wen es regnet daher war mein vorschlag das ueber einen interval zu loesen der getriggert wird durch true/false stand des regensensors. > > Wie ist deine meinung dazu Paul ? ` Funktioniert genauso. Durch die Abfrage auf Regen innerhalb des Schedule-Triggers ist das Ergebnis (fast) identisch. In Javascript würde ich es so machen:
// Regenintensität
const idCount = getIdByName('Wetterstation:1.RAIN_COUNTER');
const idRegen = getIdByName('Regensensor:1.STATE');
const idIntens = getIdByName('Regenintensitaet');
const faktor = 1; // Umrechnung in mm/h// Skriptvariablen mit Initialisierung bei Skriptstart
var menge = getState(idCount).val; // Merker Regenmenge für Differenz
var timer = null; // für setInterval, clearIntervalfunction intens() {
var count = getState(idCount).val; // aktuelle Menge in lokale Skriptvariable, da mehr als einmal verwendet
setState(idIntens, faktor * (count - menge), true);
menge = count;
}// Skriptstart
if(getState(idRegen).val) {
timer = setInterval(intens, 180000); // alle 3 Minuten
}on(idRegen, function(dp) { // Triggern bei Wertänderung
if(dp.state.val) { // es regnet
timer = setInterval(intens, 180000); // alle 3 Minuten
} else {
if(timer) clearInterval(timer); // Stopp timer
setState(idIntens, 0, true); // kein Regen, also Intensität 0
}
});Die Verwendung von setInterval() anstelle schedule() hat den Vorteil, dass auch nach Skriptstart die erste Berechnung nach genau 3 Minuten erfolgt.
-
Ja. `
Also doch Javascript full statt BlocklyDie Verwendung von setInterval() anstelle schedule() hat den Vorteil, dass auch nach Skriptstart die erste Berechnung nach genau 3 Minuten erfolgt. `
und genau das ist passiert, lief nur unendlich weiter, weil ich depp das clear interval bei Ende Regen vergessen hatte.Gruß
Rainer