NEWS
[Frage] Suche Skript für einfachen Betriebsstundenzähler
-
Hallo zusammen,
Ich habe in meiner Werkstatt gestern zwei Infrarotdeckenstrahler installiert und würde gern deren Betriebsstunden erfassen. Habe zwar hier das im Forum gefunden, ist mir aber viiiel zu kompliziert.
http://forum.iobroker.net/viewtopic.php … %C3%A4hler
Mir würde es schon reichen, wenn das Skript immer die Minuten aufaddieren würde, wenn ein bestimmter Ausgang gesetzt ist. Der Wert sollte vielleicht in einer Textdatei auf der SD Karte gesichert werden, damit er nicht immer nach einem Reboot bei Null anfängt
Wäre schön, wenn mir da jemand was basteln könnte.
Dankeschön.
ToBo
-
Bevor ich nun wieder um die Ohren gehauen bekomme. Ich habe hier rein gar keine Idee, wie man das per Script lösen kann.
Gruß.
ToBo
-
Hallo TOBO,
werde dir hier nix basteln.
Ich würde auf jeden Fall erst einmal History für den Datenpunkt aktivieren. Damit kann man ggf. später arbeiten.
Eine Idee sind zwei States/Objekte zu erstellen: zum Beispiel mit den Namen ontime und offtime.
Dann überwachst du den Datenpunkt der Lampe. Bei Einschalten lässt du dir die Aktuelle Zeit (in Millisekunden https://www.w3schools.com/jsref/jsref_gettime.asp) ausgeben. Von diesem Wert ziehst den aktuellen Wert von offtime ab und speicherst das Ergebnis in ontime. Beim Ausschalten ziehst du von der aktuellen Zeit den Wert von ontime ab und speicherst in offtime, usw.
Bei der Ausgabe musst du die Millisekunden nur in eine schönes Format umwandeln.
Gruß
Pix
Gruß
Pix
Edit: Die beiden Objekte ontime/offtime sollten natürlich zu Beginn (beim ersten Skriptstart) ein "Saldo" haben, also zB die aktuelle Uhrzeit in ms.
-
Na das ist ja schon mal ein Anfang. Werde da mal was versuchen und melde mich wieder.
-
Ich verwende diese Skript:
// Betriebsstunden Heizung // Raumkurzname am Anfang des Datenpunktnamen und als JS-Gruppenname const raum = name.split(".")[2]; const heizid = getIdByName(raum + ".Heizen"); const betriebid = getIdByName(raum + ".Heizstunden"); var betrieb = getState(betriebid).val; function stunden(dp) { if(!dp.state.val) { var aus = dp.state.lc; var ein = dp.oldState.lc; betrieb = betrieb + (aus - ein) / 3600000; setState(betriebid, betrieb, true); } } on(heizid, stunden);
-
@paul53 Ich habe mal eine Frage zu deinem Script die Betriebsstunden werden erst dann berechnet wenn der Datenpunkt in diesem Fall die Heizung wieder ausgeschaltet wurde. Oder? Gibt es auch eine Möglichkeit die Betriebsstunden so lange mit zu zählen bis der Datenpunkt wieder auf false bzw ausgeschaltet wurde.
Noch eine zweite Frage werden die Betriebsstunden bei dem nächsten mal einschalten wieder auf 0 gesetzt oder weiter gerechnet. Es wäre schön wenn das Script beide Funktion hätte.Gruß Basti
-
@tobo Guten Abend du könntest mit einem Datenpunkt arbeiten der in Schleife jede Minuten um einen Zähler erhöht wird. Ich denke für das was du vorhast sollte das reichen.
<block xmlns="https://developers.google.com/blockly/xml" type="on_ext" id="!Yu2T=MG}4ASMUCE4bZ4" x="-887" y="-612"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation> <field name="CONDITION">true</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="#|oI(iifqu_dni]QN^)y"> <field name="oid">sonoff.0.Verlaengerungsschnur.POWER2</field> </shadow> </value> <statement name="STATEMENT"> <block type="variables_set" id="m=Teu2Zy-b.N|@0XdF!l"> <field name="VAR" id="%S,KVC0xxmw?`!2=H:Jj">Betriebsstunden</field> <value name="VALUE"> <block type="get_value" id="D;!iL!U0Gh#r1N-Wcfa["> <field name="ATTR">val</field> <field name="OID">0_userdata.0.example_state</field> </block> </value> <next> <block type="timeouts_setinterval" id="+d0;tpqH%r,PS;W]x?TP"> <field name="NAME">Intervall</field> <field name="INTERVAL">1</field> <field name="UNIT">min</field> <statement name="STATEMENT"> <block type="controls_if" id="U^aU^TiKi:HBxVh:KO^c"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="rBa-O[n0s34V-xghnffs"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="8g?}|:)g~UPZce)}uZqm"> <field name="ATTR">val</field> <field name="OID">sonoff.0.Verlaengerungsschnur.POWER2</field> </block> </value> <value name="B"> <block type="logic_boolean" id="Fm8q+YU|Y?FOT.6tIo(M"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="math_change" id="*pP9oIz@y9txC|L{-dMq"> <field name="VAR" id="%S,KVC0xxmw?`!2=H:Jj">Betriebsstunden</field> <value name="DELTA"> <shadow type="math_number" id="LDIw6nwjqq#qGWwVO4gC"> <field name="NUM">1</field> </shadow> </value> <next> <block type="control" id="y47s?)ft1{nsAZ#4f0R%"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.example_state</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="6}{/!`ZS3F@@3YBZvjgm"> <field name="VAR" id="%S,KVC0xxmw?`!2=H:Jj">Betriebsstunden</field> </block> </value> </block> </next> </block> </statement> <statement name="ELSE"> <block type="timeouts_clearinterval" id="20f9o050S^Y6?n#Qy5Lx"> <field name="NAME">Intervall</field> </block> </statement> </block> </statement> </block> </next> </block> </statement> </block>
Damit solltest du weiterkommen. Du hast damit aber nur eine Minutengenaue Betriebsstundenanzahl. "example_state" muss als Zahl definiert sein und "Verlängerungsschnur Grille" sollte deine Steckdose zum an und ausschalten der IR Strahler sein.
-
@basti97 sagte: werden die Betriebsstunden bei dem nächsten mal einschalten wieder auf 0 gesetzt oder weiter gerechnet.
Es wird weiter gerechnet (kumulative Betriebsstunden).
-
@paul53 Dankeschön wo muss ich den Datenpunkt eintragen der überwacht werden soll.
-
@basti97 sagte: wo muss ich den Datenpunkt eintragen der überwacht werden soll.
Trage Deine IDs ein
// Betriebsstunden const idAktor = '...'; // zu überwachender Aktor const idBetrieb = '...'; // eigener Datenpunkt für die Betriebsstunden (kumulativ) const idDauer = '...'; // eigener Datenpunkt für die letzte Einschaltdauer (in h) var betrieb = getState(idBetrieb).val; function stunden(dp) { if(!dp.state.val) { let dauer = (dp.state.lc - dp.oldState.lc) / 3600000; betrieb += dauer; setState(idBetrieb, Math.round(betrieb * 10) / 10, true); // 1 Nachkommastelle setState(idDauer, Math.round(dauer * 10) / 10, true); // 1 Nachkommastelle } } on(idAktor, stunden);
-
@paul53 Super vielen Dank ich probiere es aus.