Daten von Solaranzeige uebernehmen und Python Script (geloest)

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    seit langem habe ich wieder einmal ein neues Projekt und wuerde mich um Unterstüzung freuen.

    Habe seit kurzem eine Solaranlage und bekomme meine Daten mit Solaranzeige (Grafana) angezeigt,

    Der Wechselrichter und der Hauszaehler wird jeweils mit einem Shelly 3EM ausgelesen.

    Ich moechte gerne mit einer RGB Wifi LED Lampe folgendes anzeigen:

    Einspeisung < 0 , Lampe ist rot

    Einspeisung > 500 , Lampe ist gelb

    Einspeisung > 1000 , Lampe ist gruen.

    Die Daten sollen von der Solaranzeige kommen und mit einem Python script ausgewertet werden,

    Ich habe da schon ein Python script das eine weisse Wifi Lampe kontrollieren kann (Ein /Aus,Full Brightness)

    Hier das funktionierende Script: (/home/pi/th/PVLight.py)


    Wie wird jetzt zum anfangen, damit ich verstehe wie es geht, z.B. diese Script so erweitert , damit wenn Einspeisung > 1000 ist, das Kommando send_command(ZONE1_ON, IP, PORT) ausgefuehrt wird.?? Was muss in Solranzeige /var/www/html/shelly.php eingetragen werden, damit die Daten vom Python script gelesen werden koennen?

    so ?????

    Code
    if ($i == 1) {
    $funktionen->log_schreiben(var_export($aktuelleDaten,1),"        ",8);
    $funktionen->log_schreiben(print_r($Daten,1)," ",9);
    
    
    // Eingefuegt fuer PVLicht.py
    
    
    $params = "{$aktuelleDaten["AC Verbrauch"]} {$aktuelleDaten["AC Leistung"]}";
    exec("/usr/bin/python3 /home/pi/th/PVLicht.py $params > /dev/null &");


    Wie sieht das neue Python script aus? mit $params kenne ich mich ueberhaut nicht aus.

    Zusammen kopiert:

    Fehler=

    pi@solaranzeige:~/th $ /home/pi/th/PVLicht.py

    usage: PVLicht.py [-h] verbrauch leistung

    PVLicht.py: error: the following arguments are required: verbrauch, leistung


    Wenn ich das verstehe, kann ich hoffentlich auch spaeter das mit den 3 Farben umsetzen.

    Fuer jede Unterstuetzung bin ich sehr dankbar, da Anfaenger in Sachen php, Daten auslesen und uebertrage, etc.

    Vielen Dank und Gruss

    gwaag

  • Daten von Solaranzeige uebernehmen und Python Script (geloest)? Schau mal ob du hier fündig wirst!

  • Ich würde nicht nur Lampen wollen...

    Wenn du ein altes Handy oder Tablet hast, mache dir ne Seite fertig, wo die gewünschten Daten drauf sind und fertig.

    Und warum Python. Die "Solaranzeige" hat für verschiedene Wechselrichter die einzelnen Dateien zum Auslesen und schreiben in die Datenbank.

    Am Ende vom Script, was meiner Meinung nach in PHP war oder ist, machst du eine Zusammenfassung der Daten in eine txt Datei. Von hier kannst du jederzeit die aktuellsten Daten für eine Webseite nehmen, die dann am Handy oder was auch immer angezeigt wird.

    Mein Handy steht nahe am TV und immer wenn ich mich im Zimmer bewege, erkennt das ein Bewegungsmelder und gibt dem Netzteil/ Ladegerät Strom, wodurch das Handy Display angeht. So sehe ich immer die aktuellen Werte, der letzten Minute. Das könnte dann so aussehen:


    oder eben nach deinem Geschmack was anderes.

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • Hallo Guido64

    schoen hast du das bei Dir realisiert.

    Fuer mich als Anfaenger zu kompliziert. Alle Werte sehe ich ja schon in der auf den Handy mit der Solaranzeige.

    Um es fuer die ganze Familie etwas einfacher zu machen, schaut wenn die Lampe an ist (1W) koennt ihr waschen, buegeln, Heisswasser machen ect.

    Also etwas ganz einfaches, als immer das Handy anzumachen.

    Wenn noch jemand weiss wie man posting 1 umsetzten kann, würde ich mich auf Loeungen freuen.

    Danke und Gruss

    gwaag

  • Hallo Tell,

    habe Deinen Teil in mein Scritp eingefuegt, sieht jetzt so aus.

    Leider passiert gar nichts wenn ich das scrïpt starte.

    In Solransicht habe ich in var/www/html/shelly.php folgendes eingefuegt:

    Code
    if ($i == 1) {
    $funktionen->log_schreiben(var_export($aktuelleDaten,1),"        ",8);
    $funktionen->log_schreiben(print_r($Daten,1)," ",9);
    
    
    // Eingefuegt fuer PVLicht.py
    
    
    $params = "{$aktuelleDaten["AC Verbrauch"]} {$aktuelleDaten["AC Leistung"]}";
    exec("/usr/bin/python3 /home/pi/th/PVLicht.py $params > /dev/null &");

    Woher weiss dein Code, dass es das machen muss ?

    Code
    einspeisung = int(args.leistung) - int(args.verbrauch)

    wie Du siehst, kenne ich mich mit dem ubehaupt nicht aus, und waere fuer eine Erklaerung sehr dankbar.

    Gruss und Danke

    gwaag

  • HalloTell,

    hier der code mit dem eingefuegten.

    Im Log steht dann nur :

    ['/home/pi/th/PVLicht.py']

    Gruss

    gwaag

  • muss zuerst schauen ob das in der shelly.php richtig ist.

    Code
    $params = "{$aktuelleDaten["AC Verbrauch"]} {$aktuelleDaten["AC Leistung"]}";
    exec("/usr/bin/python3 /home/pi/th/PVLicht.py $params > /dev/null &");

    Ev. heissen die Parameter anderst.

    Komme zurueck sobald ich mehr weiss.

    Gruss

    gwaag

  • Der Aufruf durch exec ist nicht so gut. Warum? Der Angreifer könnte deinen Webserver dazu bringen den Prozess so oft zu starten, wie der Angreifer das möchte.

    Die Alternative ist ein lokaler Webserver, der eine API anbietet und durch php abgefragt wird.

    Ich nutze sehr gerne FastAPI und die Hilfe wird automatisch generiert.

    Aufgrund der Modelle hat man auch eine Übersicht, welche Felder, Datentypen und Literals zulässig sind.


    Und im Code sieht es dann so aus:

    So sieht es im Terminal aus:

    (ich habe die Datei f.py benannt)

    Das sollte nur ein Beispiel werden und verdeutlichen welche Möglichkeiten es gibt.

  • Ich werfe jetzt mal eine andere Idee in den Raum, wie sie bei mir schon seit einem halben Jahr läuft:

    Ich lese die Daten per Python aus der Influxdb aus. Ist zwar nicht die schönste Variante, aber funktioniert. Das Skript wird per Cron einmal die Minute ausgeführt.

    Meine Raspberrypis

    RPi4 (4GB) Als kleiner "Server" mit Nextcloud, Pihole und Minetest Server

    Pi3 Als Display mit Wandeinbau im Flur (WLAN und Bluetooth kaputt)

    RPI3b Als Mediacenter

    RPI3b als Mediacenter

    RPI0 als Überwachungskamera

    RPI0 als Kamera im Vogelhaus

    RPI3b+ im Pi-Top zum Basteln

    RPI3b ohne Verwendung

    RPI0W ohne Verwendung

  • Hier mal ein Beispielskript von mir. Ich weiß jetzt nicht, wie gut du dich mit Python auskennst, aber mal ganz grob:

    In Zeile 4-6 werden Variablen definiert. Zum einen der GPIO Port, der geschalten werden soll, zum anderen die Werte, bei denen geschaltet werden soll (>5000=an, <1000=aus).

    In Zeile 8-9 wird eine Verbindung zur Datenbank hergestellt.

    In Zeile 15-17 werden die Werte mit einer Influx Query ausgelesen (in meinem Fall 10 Werte, von denen dann der Durchschnitt ausgerechnet wird(Zeile 19-26). Ab Zeile 28 Wird dann in meinem Fall ein GPIO geschaltet.

    Meine Raspberrypis

    RPi4 (4GB) Als kleiner "Server" mit Nextcloud, Pihole und Minetest Server

    Pi3 Als Display mit Wandeinbau im Flur (WLAN und Bluetooth kaputt)

    RPI3b Als Mediacenter

    RPI3b als Mediacenter

    RPI0 als Überwachungskamera

    RPI0 als Kamera im Vogelhaus

    RPI3b+ im Pi-Top zum Basteln

    RPI3b ohne Verwendung

    RPI0W ohne Verwendung

  • @DeaD_EyE

    habe es jetzt geschafft, mit Mosquitto mqtt Daten auszulesen.

    pi@solaranzeige:~ $ mosquitto_sub -v -h localhost -p 1883 -t 'shellies/shellyem3-8CAAB561948E/emeter/0/returned_energy'

    shellies/shellyem3-8CAAB561948E/emeter/0/returned_energy 0

    /emeter/0/ ist phase 1, /emeter/1 ist pase 2 und /emeter/2 ist phase 3

    Jetzt zeigt phase 1, 0 an, da nicht eingespeisst wir (Wolken)

    Wie sieht jetzt ein Python script aus, dass diese 3 Werte ausliest, phase 1-3 zusammen zaehlt fuer Einspeisung gesamt?


    jjk

    Danke fuer Dein script, Du hast recht, bin kein Experte in Python, kann eigentlich nur einfache Sachen.

    Dein Script funktioniert bei mir eigentlich, nur kenne ich die korrekten Namen der Einspeisung nicht aus der influxdb.

    Da wo bei Dir PV-Leistung steht muss bei mir der Name von returned _energy stehen? Ist der Name in der influxdb der selbe wie unter mqtt angezeigt?

    Dann muesste in Deinem script, beim meinem Anwendungsfall ja auch noch die 3 phasenwerte zusammen gezaehlet werden und weiter verarbeitet werden.

    Das mit dem Durchschnitt und den gpios brauche ich nicht.

    Haenge mal das abgeaenderte script an soll wie ich es haben moechte. (bei den ????? komme icht nicht weiter

    Danke und Gruss

    gwaag


    Edit:

    gerade gesehen das in der influxdb nur diese Werte angezeigt werden

    name: AC

    time Gesamtleistung Leistung_EinspeisungGesamt_R Leistung_EinspeisungGesamt_S Leistung_EinspeisungGesamt_T Leistung_VerbrauchGesamt_R Leistung_VerbrauchGesamt_S Leistung_VerbrauchGesamt_T PowerFactor_R PowerFactor_S PowerFactor_T Spannung_R Spannung_S Spannung_T Strom_R Strom_S Strom_T Wirkleistung_R Wirkleistung_S Wirkleistung_T

    Wie finde ich jetzt returned_energy?

  • Hast du die Daten in einem Panel in Grafana? Dann könntest du auf den Titel des Panels klicken, dann auf Edit

    Dann auf den Stift

    Und dann wird dir die Query angezeigt, die Grafana macht, um die Daten zu bekommen. In meinem Fall

    SQL
    SELECT last("PV-Leistung")  / 1000 FROM "PV-Leistung" WHERE $timeFilter

    Hier siehst du bei mir "SELECT PV-Leistung FROM PV-Leistung"

    Da du nur einen Wert brauchst, kannst du in der Query im Skript das Limit von 10 auf 1 setzen. In diesem Fall würde ich (als nicht-Profi) drei Querys machen, die jeweils eine Phase abfragen. Der Wert muss dann auch noch in eine Variable gespeichert werden. So wie ich das mache ist das, glaube ich, relativ umständlich. Vielleicht kann ein Python Experte meinen Code "verschönern". In meinem Fall mache ich das so:

    Code
    point = 0
    for point in points():
            pvleistung = point['PV-Leistung']

    Das Skript würde dann bei dir ungefähr so aussehen:

    Meine Raspberrypis

    RPi4 (4GB) Als kleiner "Server" mit Nextcloud, Pihole und Minetest Server

    Pi3 Als Display mit Wandeinbau im Flur (WLAN und Bluetooth kaputt)

    RPI3b Als Mediacenter

    RPI3b als Mediacenter

    RPI0 als Überwachungskamera

    RPI0 als Kamera im Vogelhaus

    RPI3b+ im Pi-Top zum Basteln

    RPI3b ohne Verwendung

    RPI0W ohne Verwendung

    Einmal editiert, zuletzt von jjk (24. Juli 2021 um 09:52)

  • Hallo jjk,

    ich moechte mich bei Dir herzlich fuer die Unterstuetzung bedanken, jetzt läuft es wie ich es mir vorgestellt habe.

    Nach auslesen der influx db habe ich einen Parameter gefunden der Gesamtleistung heisst, ist er negativ wird eingespeisst ist er positiv wird verbraucht.

    Habe das script ensprechend angepasst.

    In Zukunft werde ich es noch erweitern um eine Wifi Lampe zu schalten, kein Ueberschuss rot, maessig Ueberschuss gelb, viel Ueberschuss gruen, dazu kann ich dann noch Funksteckdosen mit Pilight schalten.

    Allen andern auch, Danke fuer die Hilfe.

    Gruss

    gwaag

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!