Direktverbrauch u Gesamtverbrauch als mysql Procedure

  • Hallo,


    von sollner11 habe ich den Hinweis auf euer Forum bekommen, durch einen Post auf volkszaehler-users.
    Noch mal Danke für die Info.


    Ich hab für die Auswertung der Daten meiner PV-Anlage eine Procedure geschrieben die mir Virtuelle Channels
    für den Direktverbrauch und den Gesamtverbrauch erstellt. So ähnlich wie das Script von Rainer.
    Die Procedure wird in der DB gespeichert und kann per mysql ( auch mit cron ) jederzeit aufgerufen werden.
    Beim ersten Lauf werden auch alle historichen Daten verarbeitet ( das war mir wichtig).




    Das ist die Procedure:


    vielleicht kann das ja noch jemand gebrauchen......
    Bevor man die Procedure nutzen kann müßen die 5 UUIDs im Quellcode angepasst werden.




    Und so sieht das dann aus:


    Basisdaten:



    Direktverbrauch



    Gesamtverbrauch

  • Hallo esa007
    sieht ja viel versprechend aus.Leider musst du mir noch erklären wie ich das ganze aufrufe und installiere.
    Meine uuid habe ich schon rein kopiert und nun?
    Bin leider in dieser Beziehung ein Nullchecker. :(
    Dieter

  • Hallo Dieter,


    vorab schon mal eine Kurzanleitung in ein paar Sätzen:
    Ein Anleitung mit Screenschots usw mache ich noch und poste sie dann:


    Den 1 Shritt hast du schon gemacht und deine UUIDs eingetragen.


    Als nächstes musst du die Procedure in def DB speichern.
    Das geht z.B uber PHPmyadmin. Quellcode in eine SQL Fenster der DB kopieren und mit OK ausführen.
    Es kommt dann eine OK zurück. Das geht aber auch über eine Terminal.....


    Wenn das erledigt ist ein mysql Terminal öffnen und mit der DB verbinden:
    Die Procedure wird dann wie folgt aufgerufen:
    call vc_2;
    Dann bekommst du Status Infos zurück. Wenn alles ok ist läuft sie durch.
    Für einen Bestand von ca 5 Mio Datensätze lief das bei mir beim 1 Lauf ca 5 Min.
    Der nächste Aufruf ist dann schneller


    Eine genaue Beschreibung mit Screenshots werde ich noch posten


    Gruss


    Eugen

  • Hallo,

    Zitat von esa007


    Für einen Bestand von ca 5 Mio Datensätze lief das bei mir beim 1 Lauf ca 5 Min.
    Der nächste Aufruf ist dann schneller


    also wenn das nachträglich geht, wäre das schon cool, hatte einige Aussetzer beim Hausverbrauch


    welche Hardware nutzt du denn?
    5min für 5 Mio Datensätze ist schon schnell, oder?

  • Hallo,


    die Daten werden von einem Raspi gesammelt mit 3 USB Leseköpfen für 4 Kanäle.
    Das Anzeigen der Daten auf dem Raspi hat nach einem Tag nicht mehr funtioniert. Es kammen immer Timeouts im Frontend.
    Seit dem speichere ich die Daten auf einer VM auf meinem NAS System (HP Micro Server).


    Ich hab die Procedure 2 mal geschrieben. Die erste Version hat die Records seriel verarbeitet.
    Mit dieser Version dauerte das Berechenen von einem Tag ca 3 Min. Da ich die Daten seit September habe wäaren das über 200 Tage a 3 Min. Laufzeit ca 10 Std. .....


    Bei der 2 Version habe ich die Berechnung umgestellt und mit JOINs gearbeitet. Und das geht viel schneller.
    Die Auswertung der Daten läuft über den ganzen Datenbestand und berechnet alle Werte die bisher noch nicht erstellt wurden. Beim 1ten Lauf also alle Daten beim nächsten Lauf die neu hinzugekommenen usw....


    Ich Starte die Auswertung 1 mal in der Nacht per cron...

  • Guten Morgen,


    Zitat von esa007


    Ich Starte die Auswertung 1 mal in der Nacht per cron...


    also ich habe ja immer gegen diese hochauflösenden Datenmassen gewettert, allerdings:


    Der aktuelle Hausverbrauch würde mich schon sozusagen life interessieren.
    Dafür könnte ich aber dein Script auch minütlich cronen, oder?


    Gruss

  • Zitat von sollner11

    Der aktuelle Hausverbrauch würde mich schon sozusagen life interessieren.
    Dafür könnte ich aber dein Script auch minütlich cronen, oder?


    Man kann auf jeden Fall viel öfters die Daten Auswerten. Jede Miute macht keinen Sinn da die Auswertung mindestens Daten von 2 Minute benötigt . Theoretisch alle 2 Min.
    Sinnvol ist es ab Alle 5 bzw 10 Min.


    Folgendes ist noch dabei zu Beachten:


    Im Quellcode muss man noch den Auswertungszeitruam anpassen, sodass immer bis zum letzten Datensatz gerechnet wird.
    Dafür die folgen Zeilen auskommentieren. Per Default wird bis 24 Uhr Vortag gerechnet:


    Code
    # IF bis_timestamp > UNIX_TIMESTAMP( DATE_SUB(CURDATE(),INTERVAL 0 DAY) ) * 1000
    # THEN SET bis_timestamp = UNIX_TIMESTAMP( DATE_SUB(CURDATE(),INTERVAL 0 DAY) ) * 1000;
    # END IF;


    Prüfen wie lange die Procedure für den täglichen Lauf braucht. Das muss in das cron Intervall passen.



    Hier noch ein Beispiel für den cronjob alle 10 Min:


    Code
    */10 * * * * /usr/bin/mysql -u root --password=deinspw volkszaehler < /usr/local/bin/vzlogger_service.sql >> /var/log/vzlogger_sql.log


    Im VZ /usr/local/bin die Datei vzlogger_service.sql mit folgendem Inhalt anlegen:

    Code
    Select "----------------- Start vzlogger Service -------------------------" AS INFO;
    Select NOW() as Startzeit;
    call `vc_2`;
    Select NOW() as Ende_Service;
    Select "------------------------------------------------------------------" as INFO ;
  • Bei mir passen die errechneten Werte nicht, sind viel zu niedrig.


    Du hast in deiner DB vermutlich eine hohe Datenauflösung, kann es sein das die Prozedur ein Problem damit hat wenn die Rohdaten in Minutenabstand vorliegen?


    7 = Bezug
    8 = Erzeuger
    9 = Einspeisung
    10 = Eigenverbrauch
    11 = Gesamtverbrauch




    mfg JAU

    No Shift - No Service

  • Hallo,


    wie versprochen hier noch die Anleitung für die Installation der Procedure per phpMyAdmin und die Einbindung in einen cronjob alle 15 Min.


    1. Quellcode Anpassen f. UUIDs und Laufzeit:
    Die eigenen UUIDs eintragen.
    Laufzeitende auf Maximum setzen

    Code
    # IF bis_timestamp > UNIX_TIMESTAMP( DATE_SUB(CURDATE(),INTERVAL 0 DAY) ) * 1000
    # THEN SET bis_timestamp = UNIX_TIMESTAMP( DATE_SUB(CURDATE(),INTERVAL 0 DAY) ) * 1000;
    # END IF;



    2 Procedure installieren in phpMyAdmin
    phpMyAdmin öffnen und mit volkszaehler DB verbinden. Auf Button SQL klicken


    Quellcode einfügen und mit OK bestätigen


    Prüfen ob Procedure installiert wurden



    Procedure sollte in Liste auftauchen




    3. Terminal öffnen und Ersten Durchlauf starten:
    Ein Terminl auf Frontend Server öffnen umd mit mysql verbinden:
    # mysql -u root -p volkszaehler
    Procedur starten:


    Anzeigen der erzeugten Daten:

    Code
    mysql> select * from log_virt_channel;
    +----+---------------+---------------------+---------------------+---------------------+--------------+
    | id | timestamp | erstellt_am | von_datum | bis_datum | neue_records |
    +----+---------------+---------------------+---------------------+---------------------+--------------+
    | 1 | 1366962860325 | 2013-04-29 12:35:11 | 2012-09-24 18:05:02 | 2013-04-26 09:54:20 | 216371 |
    +----+---------------+---------------------+---------------------+---------------------+--------------+
    1 row in set (0.01 sec)


    4 Cron Job erstellen:
    z.B folgenden Eintrag im cron erstellen:

    Code
    # vzlogger frontend service
    # alle 15 Min Gesamtverbrauch und Direktverbracuh
    */15 * * * * /usr/bin/mysql -u root --password=deinpw volkszaehler -e "call vc_2;" >> /var/log/vzlogger_sql.log
  • Zitat von JAU

    Bei mir passen die errechneten Werte nicht, sind viel zu niedrig.


    Du hast in deiner DB vermutlich eine hohe Datenauflösung, kann es sein das die Prozedur ein Problem damit hat wenn die Rohdaten in Minutenabstand vorliegen?
    mfg JAU


    Hallo,


    wenn pro Min 1 Wert vorhanden ist dann reicht das aus.
    Ich hab mir deine Werte mal in die DB importiert und angeschaut.
    Wenn ich die Auflösung der Kanäle anpasse dann kommt doch was sinnvolles raus?
    Hab die Auflösung bei allen Kanälen auf 1000 gestellt.