Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Stromzähler mit Volkszähler

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Stromzähler mit Volkszähler

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

      @simpixo:

      Ahh über die Scripte würde ich mich riesig freuen! Bin da noch nIcht so bewandert was Scripte erstellen angeht [emoji12][emoji23]

      Ich danke dir schon im Vorfeld dafür [emoji1360]

      Gesendet von iPhone mit Tapatalk `
      ok gerne

      Script 1. Liest die Daten über USB und speichert ein Paket ab: /home/pi/vzlog/ioHager-start

      #!/bin/bash
      # read and evaluate SML output received from EMH eHZ
      
      LOCK_FILE="/var/lock/ioHager.lock"
      MY_LOCK=$LOCK_FILE".lock"
      LOGFILE=/var/log/ioHager.log
      
      if [ -a $MY_LOCK ]
        then
          echo "run $" >> $LOGFILE
          pgrep `basename $0` >> $LOGFILE
          echo $(pgrep `basename $0`| grep -v ^$\$) >> $LOGFILE
          kill $(pgrep `basename $0`| grep -v ^$\$)
      fi
      
      rm -fr $MY_LOCK_FILE
      
      lockfile-create -p -r 0 $LOCK_FILE || exit 1
      
      # set serial device
      INPUT_DEV="/dev/ttyUSB0"
      
      #set $INPUT_DEV to 9600 8N1
      stty -F $INPUT_DEV 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
      
      SML_START_SEQUENCE="1B1B1B1B0101010176"
      METER_OUTPUT__START_SEQUENCE/
      while [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ]
      do
              METER_OUTPUT=`cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 649`
              METER_OUTPUT__START_SEQUENCE=$(echo "${METER_OUTPUT:0:18}")
      # echo "${METER_OUTPUT:0:18}"
              if [ $METER_OUTPUT__START_SEQUENCE != $SML_START_SEQUENCE ];
              then
                      echo "missed start and trying again..."
                      sleep 1s
                      #exit 1
              fi
      done
      echo ${METER_OUTPUT} > /tmp/HAGER.raw
      /home/pi/vzlog/ioHager.pl
      lockfile-remove $LOCK_FILE
      
      

      Script erzeugt die Datei: /tmp/HAGER.raw

      Script2. Erstellt aus den oben eingelesenen Daten drei Text-Dateien mit aktuellen Verbrauch, Gesamtverbrauch und Aktuellen Datum erzeugt: /home/pi/vzlog/ioHager.pl

      #!/usr/bin/perl
      
      open(FILE, '/tmp/HAGER.raw') or die "Can't read file 'filename' [$!]\n";
      $document = <file>;
      close (FILE);
      $document =~ tr/ //ds;
      #@hag_total = split(/0100010800FF/, $document);
      #@hag_tar1  = split(/0100010801FF/, $hag_total[1]);
      #print $hag_tar1[0];
      #print $document;
      ($hag_tota) = $document =~ /0100010800FF628201621E52FF(.*?)017707/;
      ($hag_tar1) = $document =~ /0100010801FF0101621E52FF(.*?)017707/;
      ($hag_tar2) = $document =~ /0100010802FF0101621E52FF(.*?)017707/;
      ($hag_wirk) = $document =~ /0100100700FF0101621B5200(.*?)017707/;
      
      $mmtota = sprintf "%.1f", hex(substr( $hag_tota, 2))/10000;
      $mmwirk = sprintf "%.0f", hex(substr( $hag_wirk, 2));
      
      open(FILE, '>', '/tmp/HAG_Total') or die "Can't read file 'filename' [$!]\n";
      print FILE $mmtota;
      close (FILE);
      
      open(FILE, '>', '/tmp/HAG_Aktuell') or die "Can't read file 'filename' [$!]\n";
      print FILE $mmwirk;
      close (FILE);
      
      ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
      
      open(FILE, '>', '/tmp/HAG_Datum') or die "Can't read file 'filename' [$!]\n";
      printf FILE ("%04d.%02d.%02d %02d:%02d:%02d", $year+1900, $mon, $mday, $hour, $m
      in, $sec);
      close (FILE);</file> 
      

      Script erzeugt die Dateien:

      ****/tmp/HAG_Total

      /tmp/HAG_Aktuell

      /tmp/HAG_Datum****

      Beide scripte werden auf dem raspi gespeichert. Mit dem Crontab Eintrag von root wir das Einlesen einmal pro Minute stattfinden.

      * * * * * /home/pi/vzlog/ioHager-start
      
      

      Im ioBroker musst ein Javascript angelegt werden:

      // Grundabfrage 
      //
      var pfad            = "Stromzähler.Hager" + ".";
      var cronStr         = "* * * * *";
      
      var abfrageTotal            = "cat /tmp/HAG_Total";
      var abfrageAktuell          = "cat /tmp/HAG_Aktuell";
      var abfrageDate             = "cat /tmp/HAG_Datum";
      
      var idHAGTotal              = pfad + 'Total';
      var idHAGAktuell            = pfad + 'Aktuell';
      var idHAGDatum              = pfad + "ZeitDatum";
      
      createState(idHAGDatum, "", {
           name: 'Datum der Zaehlerabfrage',
           desc: 'Datum der Zaehlerabfrage',
           type: 'string',
           unit: '',
           role: 'value'
      });
      
      createState(idHAGTotal, 0, {
           name: 'Stromverbrauch insgesammt',
           desc: 'Stromverbrauch insgesammt',
           type: 'number',
           unit: 'kWh',
           role: 'value'
      });
      
      createState(idHAGAktuell, 0, {
           name: 'Stromverbrauch momentan',
           desc: 'Stromverbrauch momentan',
           type: 'number',
           unit: 'Watt',
           role: 'value'
      });
      
      function abfrageDatum() {
          exec(abfrageDate, function(err, stdout, stderr) {
              if (err) {
                  log(err,"warn");
                  return;
              }
              setState(idHAGDatum, stdout);
          });
      }
      
      function abfrageHD(abfrage,dp) {
          exec(abfrage, function(err, stdout, stderr) {
              if (err) {
                  log(err,"error");
                  return;
              }
              setState(dp, parseFloat(stdout));
          });
      }
      
      function abfragen() {
          abfrageDatum();
          abfrageHD(abfrageTotal          ,idHAGTotal);
          abfrageHD(abfrageAktuell        ,idHAGAktuell);
      }
      
      // regelmässige Wiederholungen
      // -----------------------------------------------------------------------------
      schedule(cronStr, abfragen);
      
      // main
      // -----------------------------------------------------------------------------
      function main() {
          abfragen();
      }
      
      // Start Skript:
      // -----------------------------------------------------------------------------
      
      setTimeout(main,    10000);
      
      

      Jetzt solltest du folgende Datenpunkte haben

      • javascript.0.Stromzähler.Hager.Aktuell

      • javascript.0.Stromzähler.Hager.Total

      • javascript.0.Stromzähler.Hager.ZeitDatum

      Wichtig:

      a) Alle Scripte haben noch Optimierungsbedarf. Allerdings laufen sie bei mir seit einigen Wochen sehr zuverlässig. Über Verbesserungsvorschläge würde ich mich freuen.

      b) Je nach Stromzähler kann es sein, dass ein script angepasst werden muss. Dabei kann ich gerne helfen.

      1 Reply Last reply Reply Quote 0
      • S
        simpixo last edited by

        Hast du den Volkszähler auf dem selben Raspi laufen auf dem der ioBroker läuft oder separat!? Aber so wie es sieht ist es der gleiche, oder!?

        Vielen Dank für die Scripte! Das erleichtert mir die Umsetzung [emoji1360][emoji1360][emoji1360]

        Ich habe den Volkszähler auf einem separaten Raspi der ioBroker läuft in einer VM -> [ESXi]

        Der Volkszähler sammelt die Daten in einer separaten MySQL DB!

        Wie ist das bei dir!? kannst du obwohl der Vzlogger dauernd Daten sammelt mit deinem Script auf den Sensor der über USB angeschlossen ist zugreifen!? Oder nutzt du nur die Script ohne das Volkszähler Frontend!?

        Ich weiß sehr viele Fragen!

        Gruß

        Adrian

        Gesendet von iPhone mit Tapatalk

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

          @simpixo:

          Hast du den Volkszähler auf dem selben Raspi laufen auf dem der ioBroker läuft oder separat!? Aber so wie es sieht ist es der gleiche, oder!? `
          Ja. Bei mir läuft ioBroker und Volkszähler auf dem gleichen raspi

          @simpixo:

          Ich habe den Volkszähler auf einem separaten Raspi der ioBroker läuft in einer VM -> [ESXi] `
          Das ist kein Thema. Man könnte in ein Verzeichnis schreiben, das von dem ioBroker gemountet ist. Somit würde die Datenübertragung gut funktionieren.

          @simpixo:

          Der Volkszähler sammelt die Daten in einer separaten MySQL DB! `

          ok. dann müsste man auf dem ioBroker auf die MySQL von raspi zugreifen und die relevanten Daten importieren.

          @simpixo:

          Wie ist das bei dir!? kannst du obwohl der Vzlogger dauernd Daten sammelt mit deinem Script auf den Sensor der über USB angeschlossen ist zugreifen!? Oder nutzt du nur die Script ohne das Volkszähler Frontend!? `
          Also ich nutze nur die Volkszähler Hardware. Da die Daten eh in der MySQL-DB des ioBrokers landen, kann ich auf das VZ Frontend und den vzlogger verzichten. Mir ist der Mehrwert des vzloggers im Moment nicht klar.

          @simpixo:

          Ich weiß sehr viele Fragen!

          Gruß

          Adrian

          Gesendet von iPhone mit Tapatalk `
          Kein Thema. Dafür sind wir doch hier. Um uns gegenseitig zu helfen.

          1 Reply Last reply Reply Quote 0
          • S
            simpixo last edited by

            Ich musste noch das folgende Paket installieren

            apt-get install lockfile-progs

            Ich passe gerade die Skripte an meine Umgebung an. Ich werde berichten!

            Gruß

            Adrian

            1 Reply Last reply Reply Quote 0
            • S
              simpixo last edited by

              Also ich habe das soweit umgemodelt, das es bei mir läuft. Jetzt kommt das grosse ABER…..bei mir werden die 3 Objekte unter /tmp nicht richtig befüllt...

              xxx_Total = 0.0

              xxx_Datum = steht die aktuelle Zeit mit Datum

              xxx_Aktuell = 0

              Die RAW Datei wird erzeugt und sieht wie folgt aus

              1B1B1B1B0101010176070011006E0BEF6200620072630101760101070011 01F6AEA50B0901454D4800004B07FB010163CB610076070011006E0BF062 0062007263070177010B0901454D4800004B07FB070100620AFFFF726201 6501F6A4187777078181C78203FF0101010104454D480177070100000009 FF010101010B0901454D4800004B07FB0177070100010800FF6400018201 621E52FF5600032BBC340177070100010801FF0101621E52FF5600032BBC 340177070100010802FF0101621E52FF5600000000000177070100100700 FF0101621B52FF55000013D30177078181C78205FF017262016501F6A418 01018302AD3D0DD459EFE424D0E09BF2A5C0E061708272DE4A4BEEF0BAC4 8970EA499DC2ACAE60446354C2E16053A3FD18CF8EB001010163D7690076 070011006E0BF36200620072630201710163AFAD000000001B1B1B1B1A03 9CC71B1B1B1B0101010176070011006E0BF5620062007263010176010107 001101F6AEA70B0901454D4800004B07FB010163AF9F0076070011006E0B F6620062007263070177010B0901454D4800004B07FB070100620AFFFF72 62016501F6A4197777078181C78203FF0101010104454D48017707010000 0009FF010101010B0901454D4800004B07FB0177070100010800FF640001 8201621E52FF5600032BBC360177070100010801FF0101621E52FF560003 2BBC360177070100010802FF0101621E52FF560000000000017707010010 0700FF0101621B52FF55000013EF0177078181C78205FF017262016501F6 A41901018302AD3D0DD459EFE424D0E09BF2A5C0E061708272DE4A4BEEF0 BAC48970EA499DC2ACAE60446354C2E16053A3FD18CF8EB0010101633E80 0076070011006E0BF962006200726302017101
              

              Mein eingesetzter Zähler ist der EMH eHZ und das SML Standard Paket des Zählers sieht so aus

              • 1b 1b 1b 1b - Start Escape Zeichenfolge
              • 01 01 01 01 - Start Übertragung Version 1
              • 76 - jetzt kommt eine SML-Message
              • 07 - Länge (inkl. Längenbyte)
              • 00 09 00 00 13 [c8|ce] - transactionId
              • 62 00 - groupNo
              • 62 00 - abortOnError
              • 72 63 01 01 - messageBody
              • 76 - jetzt kommt eine SML-Message
              • 01 - Länge (inkl. Längenbyte)
              • 01 07 - transactionId
              • 00 09 00 00 06 [98]9a] 81 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01 01 - ?
              • 63 [96|3b] [80|58] 00 - ?
              • 76 - jetzt kommt eine SML-Message
              • 07 - Länge (inkl. Längenbyte) 
              • 00 09 00 00 13 [c9|cf] - transactionId 
              • 62 00 - groupNo
              • 62 00 - abortOnError
              • 72 63 07 01 - messageBody
              • 77 01 81 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01 - SML_GetList_Res + clientId (not set) + 01
              • 72 62 01 65 00 00 38 [00|02] 75 - (actSensorTime + secIndex?)
              • 77 07 81 81 c7 82 03 ff 01 01 01 01 04 45 4d 48 01 - Herstelleridentifikation (EMH)
              • 77 07 01 00 00 00 00 ff 01 01 01 01 09 xx xx xx xx xx xx xx xx 01 - ?
              • 77 07 01 00 01 08 01 ff 62 00 01 62 1e 52 ff 56 00 00 00 4d 02 01 - 1.8.1 (= Wirkarbeit Bezug (+) Zählerstand Tarif 1): ?.?? kWh 
              • 77 07 00 00 60 01 ff ff 01 01 01 01 0b xx xx xx xx xx xx xx xx xx xx 01 - 96.1 - ?
              • 77 07 01 00 01 07 00 ff 01 01 62 1b 52 ff 55 00 00 00 00 01 - 1.7.0 (= Wirkleistung Bezug Total (L1+L2+L3)): ?.?? W
              • 01 01
              • 63 [d7|2b] [23|a5] 00 
              • 76 - jetzt kommt eine SML-Message
              • 07 - Länge (inkl. Längenbyte)
              • 00 09 00 00 13 [ca|d0] - ?
              • 62 00 - groupNo
              • 62 00 - abortOnError
              • 72 63 02 01 71 01 63 [8e|43] [dd|bb] 00 00 00 00 - messageBody (?)
              • 1b 1b 1b 1b 1a 03 [17|21] [23|4f] 1b 1b 1b 1b 01 01 01 01
              • 76 - jetzt kommt eine SML-Message
              • 07 - Länge (inkl. Längenbyte)
              • 00 09 00 00 13 [cb|d1] - transactionId
              • 62 00 - groupNo
              • 62 00 - abortOnError
              • 72 63 01 01 - messageBody
              • 76 01 01 07 00 09 00 00 06 [99|9b] 81 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01 
              • 01 63 [c8|3a] [68|5a] 00 - ?
              • 76 07 00 09 00 00 13 [cc|d2] 
              • 62 00 - groupNo
              • 62 00 - abortOnError
              • 72 63 07 01 - messageBody
              • 77 01 81 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01 72 62 01 65 00 00 38 [01|04] 75 - 1.8.2 (= Wirkarbeit Bezug (+) Zählerstand Tarif 2): ?.?? kWh 
              • 77 07 81 81 c7 82 03 ff 01 01 01 01 04 45 4d 48 01 
              • 77 07 01 00 00 00 00 ff 01 01 01 01 09 xx xx xx xx xx xx xx xx 01 
              • 77 07 01 00 01 08 01 ff 62 00 01 62 1e 52 ff 56 00 00 00 4d 02 01 
              • 77 07 00 00 60 01 ff ff 01 01 01 01 0b xx xx xx xx xx xx xx xx xx xx 01 
              • 77 07 01 00 01 07 00 ff 
              • 01 01 - listSignature (not set) + actGatewayTime (not set)
              • 62 1b 52 ff 55 00 00 00 00 01 
              • 01 01 - listSignature (not set) + actGatewayTime (not set)
              • 63 7e 59 00 - crc16 (Checksumme nach CCITT-CRC16)
              • 76 - jetzt kommt eine SML-Message 
              • 07 - Länge (inkl. Längenbyte)
              • 00 09 00 00 13 cd - transactionId
              • 62 00 - groupNo
              • 62 00 - abortOnError
              • 72 63 02 - messageBody
              • 01 71 01 63 68 7d 00 00 00 00 
              1b 1b 1b 1b 1a 03 54 44
              

              Kannst du mir behilflich sein, muss ich dem zweiten Script noch was abändern?

              Danke schon mal dafür

              gruß

              Adrian

              1 Reply Last reply Reply Quote 0
              • S
                simpixo last edited by

                Juhuuu…. ich habe es geschafft. Die Objekte werden jetzt gefüllt

                Ich poste morgen meine Scripts für den EMH eHZ Zähler.

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

                  @simpixo:

                  Juhuuu…. ich habe es geschafft. Die Objekte werden jetzt gefüllt

                  Ich poste morgen meine Scripts für den EMH eHZ Zähler. `

                  cool. freut mich. brauchst du noch was? ich erstelle datenpunkte für verschiedene zeitabschnitte. stunde/tag/woche/monat

                  melde dich, wenn du sie haben willst.

                  1 Reply Last reply Reply Quote 0
                  • S
                    simpixo last edited by

                    @a200:

                    cool. freut mich. brauchst du noch was? ich erstelle datenpunkte für verschiedene zeitabschnitte. stunde/tag/woche/monat

                    melde dich, wenn du sie haben willst. `

                    Wie hast du das realisiert mit den Zeitabschnitten?

                    Ich versuche gerade die Daten mit Hilfe des simpleAPI Adapters in den ioBroker zu bekommen, also den Umweg über die Datein zu umgehen.

                    Gruß

                    Adrian

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

                      Ich lese die datenpunkte in den sql-history adapter ein. Und dann lese ich die daten aus.

                      So kann ich auf beliebige Zeitabschnitte zurück greifen.

                      1 Reply Last reply Reply Quote 0
                      • S
                        simpixo last edited by

                        @a200:

                        Ich lese die datenpunkte in den sql-history adapter ein. Und dann lese ich die daten aus.

                        So kann ich auf beliebige Zeitabschnitte zurück greifen. `

                        Ahh, ich dachte du machst das irgendwie mit Hilfe eines Scripts 😄

                        Kannst du eigentlich PERL? Ich versuche schon die ganze Zeit was aber es klappt einfach nicht. Ich will nämlich innerhalb deines Scripts eine URL aufrufen sowas in der Richtung:

                        > [http://192.168.160.50:8087/set/javascri … ue=$mmtota](http://192.168.160.50:8087/set/javascript.0.Stromz%C3%A4hler.EMH.Total?value=$mmtota)

                        Natürlich soll die Variable $mmtota mit übergeben werden. Wie muss denn der Aufruf innerhalb des Perl Scripts aussehen?

                        Innerhalb eines Shell Scripts geht das mit WGET aber Perl kenne ich überhaupt nicht

                        Vielleicht kennst du dich besser aus mit Perl als ich

                        Gruß

                        Adrian

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

                          @simpixo:

                          @a200:

                          Ich lese die datenpunkte in den sql-history adapter ein. Und dann lese ich die daten aus.

                          So kann ich auf beliebige Zeitabschnitte zurück greifen. `

                          Ahh, ich dachte du machst das irgendwie mit Hilfe eines Scripts 😄 `
                          Im Prinzip schon.

                          Die Last und der Zählerstand gesamt wird minütlich im Datenpunkten (dp) abgelegt und in MySQL gespeichert. Dann kann ich die Daten aus History holen und per Script Datenpunkte speichern wie:

                          Verbrauch heute = Zählerstand jetzt - Zählerstand um 00:00 - wird alle 3 Min ermittelt.

                          Verbrauch Gestern = Zählerstand um 00:00 - Zählerstand gestern um 00:00

                          Verbrauch Woche = Zählerstand jetzt - Zählerstand am letzten Montag um 00:00

                          Verbrauch Vorwoche = Zählerstand am letzten Montag um 00:00 - Zählerstand am vorletzten Montag um 00:00

                          Verbrauch Monat …

                          Verbrauch Vormonat ...

                          Diese dp kann ich dann per flot im vis visualisieren.

                          @simpixo:

                          Kannst du eigentlich PERL? Ich versuche schon die ganze Zeit was aber es klappt einfach nicht. Ich will nämlich innerhalb deines Scripts eine URL aufrufen sowas in der Richtung:

                          > [http://192.168.160.50:8087/set/javascri … ue=$mmtota](http://192.168.160.50:8087/set/javascript.0.Stromz%C3%A4hler.EMH.Total?value=$mmtota)

                          Natürlich soll die Variable $mmtota mit übergeben werden. Wie muss denn der Aufruf innerhalb des Perl Scripts aussehen?

                          Innerhalb eines Shell Scripts geht das mit WGET aber Perl kenne ich überhaupt nicht

                          Vielleicht kennst du dich besser aus mit Perl als ich

                          Gruß

                          Adrian `
                          ich würde das so machen:

                          
                          my $mmtotal = 123;    
                          my $url = 'https://192.168.160.50:8087/set/javascript.0.Stromzähler.EMH.Total?value='.$mmtotal;
                          my $html = qx{wget --quiet --output-document=- $url};
                          print $html;
                          
                          

                          alternativ

                          my $html = qx{curl --silent $url}; 
                          

                          anstatt wget.

                          qx ist ein Systemaufruf für externe programme und ist vergeleichbar mit system(), allerdings speicher er den output

                          ps. es ist ungetestet aus dem Kopf, aber könnte gehen.

                          Viel Spaß.

                          1 Reply Last reply Reply Quote 0
                          • S
                            simpixo last edited by

                            @a200:

                            ich würde das so machen:

                                
                            my $mmtotal = 123;    
                            my $url = 'https://192.168.160.50:8087/set/javascript.0.Stromzähler.EMH.Total?value='.$mmtotal;
                            my $html = qx{wget --quiet --output-document=- $url};
                            print $html;
                            
                            

                            alternativ

                            my $html = qx{curl --silent $url}; 
                            

                            anstatt wget.

                            qx ist ein Systemaufruf für externe programme und ist vergeleichbar mit system(), allerdings speicher er den output

                            ps. es ist ungetestet aus dem Kopf, aber könnte gehen. `

                            Ja genau so habe ich das jetzt gelöst 😉 und es funktioniert….Trotzdem danke für deine ausführliche Antwort

                            @a200:

                            Die Last und der Zählerstand gesamt wird minütlich im Datenpunkten (dp) abgelegt und in MySQL gespeichert. Dann kann ich die Daten aus History holen und per Script Datenpunkte speichern wie:

                            Verbrauch heute = Zählerstand jetzt - Zählerstand um 00:00 - wird alle 3 Min ermittelt.

                            Verbrauch Gestern = Zählerstand um 00:00 - Zählerstand gestern um 00:00

                            Verbrauch Woche = Zählerstand jetzt - Zählerstand am letzten Montag um 00:00

                            Verbrauch Vorwoche = Zählerstand am letzten Montag um 00:00 - Zählerstand am vorletzten Montag um 00:00

                            Verbrauch Monat …

                            Verbrauch Vormonat ... `

                            Wie sieht denn da das Script aus? :?

                            Gruß

                            Adrian

                            1 Reply Last reply Reply Quote 0
                            • S
                              simpixo last edited by

                              @a200:

                              Die Last und der Zählerstand gesamt wird minütlich im Datenpunkten (dp) abgelegt und in MySQL gespeichert. Dann kann ich die Daten aus History holen und per Script Datenpunkte speichern wie:

                              Verbrauch heute = Zählerstand jetzt - Zählerstand um 00:00 - wird alle 3 Min ermittelt.

                              Verbrauch Gestern = Zählerstand um 00:00 - Zählerstand gestern um 00:00

                              Verbrauch Woche = Zählerstand jetzt - Zählerstand am letzten Montag um 00:00

                              Verbrauch Vorwoche = Zählerstand am letzten Montag um 00:00 - Zählerstand am vorletzten Montag um 00:00

                              Verbrauch Monat …

                              Verbrauch Vormonat ...

                              Diese dp kann ich dann per flot im vis visualisieren. `

                              Noch eine Frage historisierst du immer den aktuellen Wert oder nur die Werte die sich ändern?

                              Ich meine die Möglichkeit in der DP Historie -> Nur Änderungen aufzeichnen

                              Gruß

                              Adrian

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

                                @simpixo:

                                Wie sieht denn da das Script aus? :? `

                                Kann ich dir morgen von Zuhause schicken. Heute gibt es eine Weihnachtsfeier, da komme ich etwas später heim! 😄

                                Die aktuelle Last speichere ich jede Minute. Die kann man später eh löschen. Sie werden nur für die ganz feine Anzeige benötigt.

                                Auch den Gesamtstand speichere ich komplett. Muss später schauen ob das wirklich nötig ist. Aber das sind die Grunddaten mit denen ich arbeite und aus denen ich den Zählerstand zu einem bestimmten Zeitpunkt mir holen kann. Die Daraus berechnete Werte werden nur bei Änderung gespeichert.

                                Die Änderungen erfolgen aber nur Stündlich/Täglich/Wöchentlich/Monatlich je nach Datenpunkt. Diese Datenpunkte werden auch in History archiviert. Die Brauche ich für meine Diagramme für den jeweiligen Verbrauch.

                                1 Reply Last reply Reply Quote 0
                                • S
                                  simpixo last edited by

                                  @a200:

                                  Kann ich dir morgen von Zuhause schicken. Heute gibt es eine Weihnachtsfeier, da komme ich etwas später heim! 😄 `

                                  Hast du mich vergessen!? [emoji53][emoji6]oder ist die Weihnachtsfeier ausgeartet [emoji23][emoji6]

                                  Gruß

                                  Adrian

                                  Gesendet von iPhone mit Tapatalk Pro

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

                                    ** KOPFWEH ** 😢

                                    Das alles ist noch sehr quick & dirty, aber ich denke du wirst schon merken was ich meine.

                                    Grundlage ist der Datenpunkt "javascript.0.Stromzähler.Hager.Total-h".

                                    ! // Zählerstand vom Anfang der akt. Stunde wird ermittelt // ! var cronStr = "1 * * * *"; ! var abfrageTotal = "cat /tmp/HAG_Total"; var idHAGTotal = "javascript.0.Stromzähler.Hager.Total-h"/*Stromverbrauch insgesammt*/; ! createState(idHAGTotal, 0, { name: 'Stromverbrauch insgesammt', desc: 'Stromverbrauch insgesammt', type: 'number', unit: 'kWh', role: 'value' }); ! function abfrageHD(abfrage,dp) { exec(abfrage, function(err, stdout, stderr) { if (err) { log(err,"error"); return; } setState(dp, parseFloat(stdout)); }); } ! function abfragen() { abfrageHD(abfrageTotal ,idHAGTotal); } ! function getHistoryRows(date, callback) { var options = { start: date + 86400000, end: date , count: 1, aggregate: 'none', //'total', // One of: max, min, average, total //limit: 1, ignoreNull: 1 }; } ! // regelmässige Wiederholungen // ----------------------------------------------------------------------------- schedule(cronStr, abfragen); ! // main // ----------------------------------------------------------------------------- function main() { abfragen(); } ! // Start Skript: // ----------------------------------------------------------------------------- ! setTimeout(main, 10000); !
                                    Hier werden erst die Zwischenwerte für die Berechnungen ermittelt.

                                    ! ````
                                    // Ermittelt die Einzelne Werte akt/stunde/tag/woche/monat/ für vis
                                    //
                                    ! var cronStr = "3 * * * *";
                                    var Strom_1 = "javascript.0.TMP-Werte.Strom-Wert_1"/Strom-Wert_1/;
                                    var Strom_2 = "javascript.0.TMP-Werte.Strom-Wert_2"/Strom-Wert_2/;
                                    var Strom_3 = "javascript.0.TMP-Werte.Strom-Wert_3"/Strom-Wert_3/;
                                    var Strom_4 = "javascript.0.TMP-Werte.Strom-Wert_4"/Strom-Wert_4/;
                                    var Strom_5 = "javascript.0.TMP-Werte.Strom-Wert_5"/Strom-Wert_5/;
                                    var Strom_6 = "javascript.0.TMP-Werte.Strom-Wert_6"/Strom-Wert_6/;
                                    var Strom_7 = "javascript.0.TMP-Werte.Strom-Wert_7"/Strom-Wert_7/;
                                    var Strom_8 = "javascript.0.TMP-Werte.Strom-Wert_8"/Strom-Wert_8/;
                                    var HAG_Total = "javascript.0.Stromzähler.Hager.Total"/Stromverbrauch insgesammt/;
                                    var Strom_Stunde = "javascript.0.Stromzähler.Hager.Verbrauch.Stunde";
                                    var Strom_Tag = "javascript.0.Stromzähler.Hager.Verbrauch.Tag";
                                    var Strom_Woche = "javascript.0.Stromzähler.Hager.Verbrauch.Woche";
                                    var Strom_Monat = "javascript.0.Stromzähler.Hager.Verbrauch.Monat";
                                    var Strom_Last = "javascript.0.Stromzähler.Hager.Verbrauch.Last_Upd";
                                    var Strom_Heute = "javascript.0.Stromzähler.Hager.Verbrauch.Heute";
                                    var Farbe_Heute = "javascript.0.Stromzähler.Hager.Verbrauch.Heute-Farbe";
                                    ! var col_heute = "#ffffff";
                                    ! function getHistoryRow(date, targetId, callback) {
                                    var options = {
                                    start: date,
                                    //end: date,
                                    count: 1,
                                    aggregate: 'none', //'total', // One of: max, min, average, total
                                    ignoreNull: 1
                                    };
                                    ! sendTo ("sql.1", "getHistory", { id: "javascript.0.Stromzähler.Hager.Total-h", options: options }, function(data) {
                                    if (data) {
                                    var rows = [];
                                    rows = rows.concat(data.result);
                                    setState(targetId, parseFloat(rows[0].val));
                                    // log(targetId + " ts: " + formatDate(rows[0].ts, "DD.MM.YYYY hh:mm:ss") + " val: " + rows[0].val + " datum: " + rows[0].ts);
                                    }
                                    });
                                    }
                                    ! createState(Strom_1, 0, {
                                    name: 'Stromverbrauch aktuelle Stunde',
                                    desc: 'Stromverbrauch aktuelle Stunde',
                                    type: 'number',
                                    role: 'value'
                                    });
                                    createState(Strom_2, 0, {
                                    name: 'Stromverbrauch letzte Stunde',
                                    desc: 'Stromverbrauch letzte Stunde',
                                    type: 'number',
                                    role: 'value'
                                    });
                                    createState(Strom_3, 0, {
                                    name: 'Stromverbrauch heute 00:00',
                                    desc: 'Stromverbrauch heute 00:00',
                                    type: 'number',
                                    role: 'value'
                                    });
                                    createState(Strom_4, 0, {
                                    name: 'Stromverbrauch gestern 00:00',
                                    desc: 'Stromverbrauch gestern 00:00',
                                    type: 'number',
                                    role: 'value'
                                    });
                                    createState(Strom_5, 0, {
                                    name: 'Stromverbrauch am Anfang der Woche',
                                    desc: 'Stromverbrauch am Anfang der Woche',
                                    type: 'number',
                                    role: 'value'
                                    });
                                    createState(Strom_6, 0, {
                                    name: 'Stromverbrauch am Anfang der Vorwoche',
                                    desc: 'Stromverbrauch am Anfang der Vorwoche',
                                    type: 'number',
                                    role: 'value'
                                    });
                                    createState(Strom_7, 0, {
                                    name: 'Stromverbrauch am 01. akt. Monats',
                                    desc: 'Stromverbrauch am 01. akt. Monats',
                                    type: 'number',
                                    role: 'value'
                                    });
                                    createState(Strom_8, 0, {
                                    name: 'Stromverbrauch am 01. des Vormonats',
                                    desc: 'Stromverbrauch am 01. des Vormonats',
                                    type: 'number',
                                    role: 'value'
                                    });
                                    createState(Strom_Stunde, 0, {
                                    name: 'Stromverbrauch der letzen Stunde',
                                    desc: 'Stromverbrauch der letzen Stunde',
                                    type: 'number',
                                    unit: 'kWh',
                                    role: 'value'
                                    });
                                    createState(Strom_Tag, 0, {
                                    name: 'Stromverbrauch des Vortages',
                                    desc: 'Stromverbrauch des Vortages',
                                    type: 'number',
                                    unit: 'kWh',
                                    role: 'value'
                                    });
                                    createState(Strom_Woche, 0, {
                                    name: 'Stromverbrauch der Vorwoche',
                                    desc: 'Stromverbrauch der Vorwoche',
                                    type: 'number',
                                    unit: 'kWh',
                                    role: 'value'
                                    });
                                    createState(Strom_Monat, 0, {
                                    name: 'Stromverbrauch des Vormonats',
                                    desc: 'Stromverbrauch des Vormonats',
                                    type: 'number',
                                    unit: 'kWh',
                                    role: 'value'
                                    });
                                    createState(Strom_Last, 0, {
                                    name: 'Last Update',
                                    desc: 'Last Update',
                                    type: 'string',
                                    role: 'value'
                                    });
                                    createState(Strom_Heute, 0, {
                                    name: 'Stromverbrauch Heute',
                                    desc: 'Stromverbrauch Heute',
                                    type: 'number',
                                    unit: 'kWh',
                                    role: 'value'
                                    });
                                    createState(Farbe_Heute, 0, {
                                    name: 'Farbe fuer Heute',
                                    desc: 'Farbe fuer Heute',
                                    type: 'string',
                                    role: 'value'
                                    });
                                    ! function ausfuehren() {
                                    dStunde = formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"); // Jetzt
                                    setState(Strom_Last, dStunde);

                                    dStunde = formatDate(new Date(), "JJJJ.MM.TT SS:00:00"); // heute aktuelle Stunde
                                    //log("Datum: " + dStunde);
                                    iStunde = getDateObject(dStunde).getTime();
                                    getHistoryRow(iStunde, Strom_1);

                                    ! dStunde = formatDate(new Date(), "JJJJ.MM.TT SS:00:00"); // heute aktuelle Stunde -1 h
                                    iStunde = getDateObject(dStunde).getTime() - 3600000;
                                    dStunde = formatDate(getDateObject(iStunde), "JJJJ.MM.TT SS:mm:ss");
                                    //log("Datum: " + dStunde);
                                    getHistoryRow(iStunde, Strom_2);
                                    ! dStunde = formatDate(new Date(), "JJJJ.MM.TT 00:00:00"); // heute 00:00 Uhr
                                    //log("Datum: " + dStunde);
                                    iStunde = getDateObject(dStunde).getTime(); // - 1800000;
                                    getHistoryRow(iStunde, Strom_3);
                                    ! dStunde = formatDate(new Date(), "JJJJ.MM.TT 00:00:00"); // gestern 00:00 Uhr
                                    iStunde = getDateObject(dStunde).getTime() - 86400000;
                                    dStunde = formatDate(getDateObject(iStunde), "JJJJ.MM.TT SS:mm:ss");
                                    //log("Datum: " + dStunde);
                                    getHistoryRow(iStunde, Strom_4);
                                    ! dWochentag = (new Date().getDay() === 0 ? 7 : new Date().getDay());
                                    dStunde = formatDate(new Date(), "JJJJ.MM.TT 00:00:00"); // Wochenanfang 00:00 Uhr
                                    iStunde = getDateObject(dStunde).getTime() - ((dWochentag - 1) * 86400000);
                                    dStunde = formatDate(getDateObject(iStunde), "JJJJ.MM.TT SS:mm:ss");
                                    //log("Wochenanfang: " + dStunde);
                                    getHistoryRow(iStunde, Strom_5);
                                    ! dWochentag = (new Date().getDay() === 0 ? 7 : new Date().getDay());
                                    dStunde = formatDate(new Date(), "JJJJ.MM.TT 00:00:00"); // Vorwochenanfang 00:00 Uhr
                                    iStunde = getDateObject(dStunde).getTime() - ((dWochentag + 6) * 86400000);
                                    dStunde = formatDate(getDateObject(iStunde), "JJJJ.MM.TT SS:mm:ss");
                                    //log("Vorwoche: " + dStunde);
                                    getHistoryRow(iStunde, Strom_6);
                                    ! dStunde = formatDate(new Date(), "JJJJ.MM.01 00:00:00"); // Monatsanfang 00:00 Uhr
                                    iStunde = getDateObject(dStunde).getTime();
                                    dStunde = formatDate(getDateObject(iStunde), "JJJJ.MM.TT SS:mm:ss");
                                    //log("Monat: " + dStunde);
                                    getHistoryRow(iStunde, Strom_7);
                                    ! dJahr = formatDate(new Date(), "JJJJ"); // Vormonatsanfang 00:00 Uhr
                                    dMonat = formatDate(new Date(), "MM");
                                    if(dMonat == 1)
                                    {
                                    dJahr = dJahr -1;
                                    dMonat = 12;
                                    }
                                    else
                                    {
                                    dMonat = dMonat -1;
                                    }
                                    sDatum = dJahr + "." + dMonat + ".01 00:00:00";
                                    dStunde = formatDate(new Date(), sDatum);
                                    iStunde = getDateObject(dStunde).getTime();
                                    dStunde = formatDate(getDateObject(iStunde), "JJJJ.MM.TT SS:mm:ss");
                                    //log("Vormonat: " + dStunde);
                                    getHistoryRow(iStunde, Strom_8);
                                    ! // Setze Ausgabepunkte
                                    setState(Strom_Stunde, ((Math.round((((Math.round(parseFloat(getState(Strom_1).val)*10))/10) - (Math.round(parseFloat(getState(Strom_2).val)*10))/10)*10))/10)*1000);
                                    setState(Strom_Tag, ((Math.round((((Math.round(parseFloat(getState(Strom_3).val)*10))/10) - (Math.round(parseFloat(getState(Strom_4).val)*10))/10)*10))/10));
                                    setState(Strom_Woche, ((Math.round((((Math.round(parseFloat(getState(Strom_5).val)*10))/10) - (Math.round(parseFloat(getState(Strom_6).val)*10))/10)*10))/10));
                                    setState(Strom_Monat, ((Math.round((((Math.round(parseFloat(getState(Strom_7).val)*10))/10) - (Math.round(parseFloat(getState(Strom_8).val)*10))/10)*10))/10));
                                    setState(Strom_Heute, ((Math.round((((Math.round(parseFloat(getState(HAG_Total).val)*10))/10) - (Math.round(parseFloat(getState(Strom_3).val)*10))/10)*10))/10));
                                    ! if (getState(Strom_Tag).val == getState(Strom_Heute).val) {
                                    col_heute = "#faf600"; // gelb
                                    }
                                    else if (getState(Strom_Tag).val < getState(Strom_Heute).val ) {
                                    col_heute = "#f20202"; // rot
                                    }
                                    else {
                                    col_heute = "#21bd1f"; // gruen
                                    }
                                    setState(Farbe_Heute, col_heute);
                                    ! log("Letzte Stunde " + ((Math.round((((Math.round(parseFloat(getState(Strom_1).val) * 10))/10) - (Math.round(parseFloat(getState(Strom_2).val) * 10))/10)*10))/10) + " kWh");
                                    log("Letzter Tag: " + ((Math.round((((Math.round(parseFloat(getState(Strom_3).val) * 10))/10) - (Math.round(parseFloat(getState(Strom_4).val) * 10))/10)*10))/10) + " kWh");
                                    log("Letzte Woche: " + ((Math.round((((Math.round(parseFloat(getState(Strom_5).val) * 10))/10) - (Math.round(parseFloat(getState(Strom_6).val) * 10))/10)*10))/10) + " kWh");
                                    log("Letzter Monat: " + ((Math.round((((Math.round(parseFloat(getState(Strom_7).val) * 10))/10) - (Math.round(parseFloat(getState(Strom_8).val) * 10))/10)*10))/10) + " kWh");
                                    log("Heute: " + ((Math.round((((Math.round(parseFloat(getState(HAG_Total).val) * 10))/10) - (Math.round(parseFloat(getState(Strom_3).val) * 10))/10)*10))/10)+ " kWh");
                                    }
                                    ! // regelmässige Wiederholungen
                                    // -----------------------------------------------------------------------------
                                    schedule(cronStr, ausfuehren);
                                    ! // main
                                    // -----------------------------------------------------------------------------
                                    function main() {
                                    ausfuehren();
                                    }
                                    ! // Start Skript:
                                    // -----------------------------------------------------------------------------
                                    ! setTimeout(main, 10000);

                                    1 Reply Last reply Reply Quote 0
                                    • S
                                      simpixo last edited by

                                      @a200:

                                      ** KOPFWEH ** 😢

                                      Das alles ist noch sehr quick & dirty, aber ich denke du wirst schon merken was ich meine. `

                                      Ohje…. geht aber auch wieder vorbei 😄

                                      Danke für die Skripte... werde diese mir mal anschauen und versuchen zu verstehen 😉

                                      Gruß

                                      Adrian

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

                                        Neuer Adapter … gern Testen :-))

                                        http://forum.iobroker.net/viewtopic.php?f=36&t=5047

                                        1 Reply Last reply Reply Quote 0
                                        • D
                                          digitthomas last edited by

                                          Moin,

                                          da ich damals bei einer Google-Suche zu "ioBroker mit Volkszähler verbinden" als erstes hier gelandet bin, lasse ich mal mein Skript hier, in der Hoffnung, dass es noch jemand anderem helfen kann: https://gist.github.com/digitmind-net/d … 87b2181c04

                                          Der Vorteil gegenüber dem "smartmeter"-Adapter ist, dass es bei schon bestehender Installation vom Volkszähler einfacher einzurichten ist und durch die hohe Kompatiblität des Volkszählers mehr Geräte unterstützt. Das ist aber nur ein Nischenfall für diejenigen, die sowieso schon einen eingerichteten Volkszähler besitzen.

                                          Lg

                                          Thomas

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

                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          872
                                          Online

                                          31.6k
                                          Users

                                          79.6k
                                          Topics

                                          1.3m
                                          Posts

                                          4
                                          19
                                          4654
                                          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