Mit Volkszähler und Raspi-Erweiterung Eigenverbrauch steuern

  • Morgen.


    Es wird Winter und hab wieder Zeit zum basteln. Um diesen thread: http://www.photovoltaikforum.c…cher-schalten-t90115.html geht es hier.
    Habe von Udo eine Erweiterung mit Schaltausgängen für den Raspberry Pi erhalten. Über die beiden S0-Schnittstellen wird die Datenbank gefüttert. Um die Schaltausgänge zu nutzen, fügt Ihr

    Code
    # die Relais ansteuern
    echo 9 > /sys/class/gpio/export && echo out > /sys/class/gpio/gpio9/direction
    echo 11 > /sys/class/gpio/export && echo out > /sys/class/gpio/gpio11/direction


    in die /etc/rc.local ein. Danach ist es möglich, per

    Code
    echo 1 > /sys/class/gpio/gpio9/value

    das Relais anziehen zu lassen, Schaltausgang ist geschlossen und mit

    Code
    echo 0 > /sys/class/gpio/gpio9/value

    den Schaltausgang zu öffnen.


    Mit dem Script vom obigen thread wollte ich den Eigenverbrauch erhöhen. Bekomme aber die Fehlermeldung:


    Bin nicht so der Könner in Sachen php, wo liegt der Fehler?


    Gruß, Mike

    • Offizieller Beitrag

    Hi,


    - in PHP jede Anweisung mit Semikolon abschließen
    - Auf die Klammer-Ebenen achten :)
    - Schließendes ?> Tag ist nicht nötig



    Knut

  • Hallo Knut.


    Danke für den Tip, das wars. :danke::danke::danke:


    Jetzt kommt eine andere Meldung.



    Line 6 ist der hier:

    Code
    $lastValue = $content->data->tuples[$content->data->rows-1][1];


    Paar Minuten später:

    Code
    pi@raspberrypi ~ $ php test.php
    PHP Notice:  Undefined offset: 21 in /home/pi/test.php on line 6
    LastValue:
    pi@raspberrypi ~ $


    Mit den Zahlen könnte ich sogar was anfangen. 7 bzw. 21 Impulse in 70sec ergibt 360 oder 1080. Knapp 400 Wh haben wir hier ohne WP, 1150 Wh wenn die WP läuft. Eventuell liege ich hier falsch.


    Ist schon ein bisschen her, aber vieleicht können JAU oder DieterN noch was dazu sagen.


    Gruß, Mike

    • Offizieller Beitrag

    Hi,


    fürge mal vor


    $content=json_decode($content);


    noch


    print_r(json_decode($content,TRUE));


    ein.


    Poste dann mal die Ausgabe, wenn so ein Fehler auftritt.


    Und/oder ersetze


    $lastValue = $content->data->tuples[$content->data->rows-1][1];


    gegen


    // get last array element
    $lastRow = array_slice($content->data->tuples, -1);
    $lastValue = $lastRow[1];


    Knut

  • Gesagt, getan.



    Das Ergebnis:


    Hmm, Sagt mir nichts. die Meldung kommt noch zum Schluss.


    Mike

    • Offizieller Beitrag

    Hi,


    was ich vermutet habe, rows <> Anzahl tuples



    0 .. 27 == 28 Elemente


    Also ersetze einfach


    Code
    $lastValue = $content->data->tuples[$content->data->rows-1][1];


    gegen


    Code
    // Extract last tuple
    $lastRow = array_slice($content->data->tuples, -1);
    $lastValue = $lastRow[1];


    Knut

  • Moin Knut.


    Sieht jetzt so aus.


    Ich glaube, das geht in die verkehrte Richtung.


    Das Script fragt ab, wieviel Einträge die s0vz in x Sekunden ind die DB schreibt, hier sind es 70 s. Bei unserem Zähler sind es 1000 Imp/kWh, bei 1 kWh alle 3,6 s ein Impuls, bei 100 Wh alle 36 s usw... Wenn ich nur den letzten Wert nehme, habe ich 1. Da weiß ich nicht, was ich eingespeist habe.


    Knut, wie weit Du dich mit Volkszähler beschäftigt hast weiß ich nicht. s0vz schreibt nur den Wert 1 in die Datenbank. Anhand der Zeitunterschiede der timestamps wird der Verbrauch ermittelt. Wenn ich alle zB. alle 20 s einen Impuls habe, speise ich 180 Wh ein. Bekomme ich keinen Impuls, bin ich darunter, die elektrische Heizstab wird abgeschaltet. Bei 17 Impulsen in 20 s habe ich einen Überschuß von über 3 kWh und kann den Heizstab wieder einschalten.so in etwa habe ich mir das vorgestellt.


    Ich weiß, per Script die DB abfragen um den Verbrauch zu ermitteln ist suboptimal.
    Ideal wäre es, die Zeiten zwischen der Impulse zu erfassen. wiringpi könnte was sein, läuft parallel zum s0vz und kann die Impulse hochzählen. Warum auch nicht die Zeiten zwischen den Impulsen ausgeben.


    Gruß, Mike

    • Offizieller Beitrag

    Hi,


    na, wkommt drauf an, wie die Antwort der Anfrage zu interpretieren ist.


    Was ist der Inhalt eines Tuples?


    Ich nehme an, Timestamp, anliegende Leistung in Watt und "Anzahl" der Impulse (hier immer 1).
    Für 1000 Impulse macht das einfach:


    Code
    Timestamp          Zeitdiff. [s]     Leistung [W]
    1418936278158
    1418936280590      2,43              3600 / 2,43 = 1480,263
    1418936283029      2,44              3600 / 2,44 = 1476,015
    1418936285475      2,45              3600 / 2,45 = 1471,791


    Jetzt ist die Frage, was Du möchtest.


    - Wie schnell möchtest/kannst Du schalten?
    - Möchtest Du alle Impulse verwenden, um selber mit Hilfe des ersten und letzten Timestamp den Durchschnitt auszurechnen?
    - Möchtest Du einfach den letzten Wert (so wie jetzt) verwenden?


    Das Prinzip ist soweit klar ich verwende es ähnlich.
    Ähnlich deshalb, weil ich extern die Umrechnung Impulse --> Leistung mache und momentan aller 15sec. den Leistungswert wegschreibe, also nicht alle Impulse einzeln.


    Meine API z.B. hat auch ein Flag (readlast) womit ich nur den jeweils letzten Wert bekomme, oder durch geschickte Kombination von Startzeitpunkt und Zeitraum der Durchschnittsberechnung auch "nur" exakt einen Wert.


    Ich würde z.B. anfragen - Bilde mir den "Durchschnitt pro Minute", beginne "Jetzt minus 60 sec." > Das kann nur einen Satz ergeben... :)


    Ich weiß nicht, inwieweit der VZ dies evtl. auch kann. :?:


    Versuch mal das:



    Knut

  • Hallo Knut,
    Das was Du hast sieht gut aus. So würde das die DB entlasten, habe aktuell jetzt gut 20000 Einträge pro Tag. Auf Dauer bisschen viel. :D


    Code
    Ich nehme an, Timestamp, anliegende Leistung in Watt und "Anzahl" der Impulse (hier immer 1).
    Für 1000 Impulse macht das einfach:
    
    
    Code: Alles auswählen
        Timestamp          Zeitdiff. [s]     Leistung [W]
        1418936278158
        1418936280590      2,43              3600 / 2,43 = 1480,263
        1418936283029      2,44              3600 / 2,44 = 1476,015
        1418936285475      2,45              3600 / 2,45 = 1471,791


    Ja genau, so füttert s0vz die Datenbank. Hoher Verbrauch -> viele Einträge.


    Code
    Jetzt ist die Frage, was Du möchtest.
    
    
    - Wie schnell möchtest/kannst Du schalten?
    - Möchtest Du alle Impulse verwenden, um selber mit Hilfe des ersten und letzten Timestamp den Durchschnitt auszurechnen?
    - Möchtest Du einfach den letzten Wert (so wie jetzt) verwenden?



    Ich möchte die aktuelle Übermenge der PV-Anlage erfassen und gegebenfalls selber nutzen, Bei einer Auflösung vonn 1000 Imp/kWh gehen ja bei 200 Wh schon 18 s ins Land, da wird eine Auflösung unter 20 s eng.


    Also, bei ausreichender Übermenge soll ein Verbraucher zugeschaltet werden. Jetzt suche ich eine Möglichkeit, sowas zu händeln. Ob perl, php, phyton oder C, da bin ich ganz offen.


    Bin gerade mit wiringpi im Gange, läuft als Counter, da wird die Summe der Impulse in eine Datei geschrieben. Kann per cronjob minütlich den letzten Wert vom Aktuellen subtrahieren und daraus die aktuelle Übermenge oder Bezug errechnen und gegebenfalls einen Heizstab zuschalten. Das ist der Plan. :D


    Zur Zeit lese ich den WR raus. und bei einer gewissen Erzeugung wird die WP aus der Nachtabsenkung geholt und ballert los. nicht das Gelbe vom Ei, ich weiß. :-?



    Gruß, Mike

    • Offizieller Beitrag

    Hi,


    Hast PN


    Zitat von grueger-pv

    Jetzt suche ich eine Möglichkeit, sowas zu händeln. Ob perl, php, phyton oder C, da bin ich ganz offen.


    Geht auch einfach Shell :)


    Knut