Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Frage] Suche Skript für einfachen Betriebsstundenzähler

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Frage] Suche Skript für einfachen Betriebsstundenzähler

    This topic has been deleted. Only users with topic management privileges can see it.
    • T
      TOBO last edited by

      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

      1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        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.

        1 Reply Last reply Reply Quote 0
        • T
          TOBO last edited by

          Na das ist ja schon mal ein Anfang. Werde da mal was versuchen und melde mich wieder.

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            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);
            
            
            Basti97 1 Reply Last reply Reply Quote 0
            • Basti97
              Basti97 Most Active @paul53 last edited by

              @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 🙂 🙂

              paul53 1 Reply Last reply Reply Quote 0
              • D
                Dragon @TOBO last edited by Dragon

                @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.

                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 @Basti97 last edited by

                  @basti97 sagte: werden die Betriebsstunden bei dem nächsten mal einschalten wieder auf 0 gesetzt oder weiter gerechnet.

                  Es wird weiter gerechnet (kumulative Betriebsstunden).

                  Basti97 1 Reply Last reply Reply Quote 0
                  • Basti97
                    Basti97 Most Active @paul53 last edited by

                    @paul53 Dankeschön wo muss ich den Datenpunkt eintragen der überwacht werden soll.

                    paul53 1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 @Basti97 last edited by paul53

                      @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);
                      
                      Basti97 1 Reply Last reply Reply Quote 0
                      • Basti97
                        Basti97 Most Active @paul53 last edited by

                        @paul53 Super vielen Dank ich probiere es aus. 🙂

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        845
                        Online

                        31.9k
                        Users

                        80.1k
                        Topics

                        1.3m
                        Posts

                        5
                        11
                        1659
                        Loading More Posts
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes
                        Reply
                        • Reply as topic
                        Log in to reply
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                        The ioBroker Community 2014-2023
                        logo