Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

Dummy, notify, button, trigger, und was weiß ich alles...

Begonnen von wowogiengen, 10 November 2024, 11:35:00

Vorheriges Thema - Nächstes Thema

wowogiengen

Hallo,
ich bin gerade ein bisschen ratlos.

Ich habe eine PV-Anlage, die mir die Daten auf 2 verschiedene Arten liefern kann:
  • Zum einen über die Web-API,
  • Zum anderen über Modbus-TCP,

Beides funktioniert außerhalb von fhem über python-Skripte einwandfrei.

Im ersten Fall habe ich dann eine JSON-Datei bzw. ein JSON-Objekt das ich im python-Skript auswerten kann.

Den zweiten Fall habe ich noch nicht weiterverfolgt, aber da bekomme ich für jedes gelesene Register einen 16 Bit unsigned int Wert heraus, den man dann entsprechend des Registers multiplizieren und mit Einheit versehen muss.

Damit sind die Daten aber noch nicht in fhem in der Datenbank für die Anzeige als SVG-Plot.
Obwohl - ich habe die Datenbank bereits von extern (mit einem anderen python-Skript) mit den passenden Readings gefüllt und konnte somit den Plot erzeugen.

Also grundsätzlich geht da was.

Mein Problem ist jetzt folgendes:

Ich möchte das Auslesen mit fhem automatisieren und die Werte als Readings in einem Device haben.

Über modbus scheint das ja relativ einfach zu gehen, wenn man die entsprechenden Attribute im device setzt. Da ich aber aktuell wieder keinen Zugriff auf die Modbus-Schnittstelle habe (der Dongle muss erst getauscht und dann eingestellt werden), müsste ich das ganze über die Web-API-Schnittstelle machen.

Ich würde also zyklisch (über ein AT-Device) das python Skript aufrufen. Dieses generiert mir dann die JSON-Datei, oder zusätzlich sogar die DB-Einträge.

Aber wie bekommt fhem dann die aktuellen Readings mit?

Am elegantesten wäre es, wenn man ein fhem-internes Skript hätte, das das python-Skript aufruft, und dann die Datei auswertet, die Readings generiert, die dann mit dem DbLog-Device in die Datenbank geschrieben werden könnten...

Kann mir da vielleicht jemand mit Tips und Codeschnipseln helfen?

Viele Grüße

Wolfgang



P.S.:

Wie kann ich

python3 /opt/fhem/python/allinone.pyvon fhem aus sauber aufrufen?

beim notify würde es ja so ungefähr gehen:


defmod act_on_testdummy notify testdummy \
{ \
system("python3 /opt/fhem/python/allinone.py")\
}
attr act_on_testdummy disable 1
attr act_on_testdummy room test
attr act_on_testdummy verbose 1

setstate act_on_testdummy disabled
setstate act_on_testdummy 2024-11-10 10:51:26 state disabled
setstate act_on_testdummy 2024-11-09 14:48:00 triggeredByDev testdummy
setstate act_on_testdummy 2024-11-09 14:48:00 triggeredByEvent off


Aber ich krieg das nicht hin, dass der testdummy ein event generiert, auf welches das notify dann immer reagiert.
Über das AT-Device geht es auch, aber die Web-API braucht relativ lange, bis die Antwort da ist...

TomLee

ZitatAber wie bekommt fhem dann die aktuellen Readings mit?
Hallo,

Vorschlag ohne at/ notify:

Die Datei auf dem System regelmäßig mit einem cronjob erstellen lassen und in FHEM erstellt eine JsonMod-Definition die gewünschten Readings für DbLog.

Gruß Thomas

wowogiengen

Hallo,
das hört sich gut an...
Aber irgendwie fehlt mir ein Beispiel, um  die Daten aus meiner JSON-Datei zu bekommen...
Selbst das einfachste krieg ich nicht hin:

define PVJSON JsonMod file:/opt/fhem/python/data2024-11-10_10-43-03.json
attr PVJSON readingList single(jsonPath('$[info][time]'), 'Time', '');;
attr PVJSON verbose 5
#   API_LAST_MSG 200
#   API_LAST_RES 1731239867.04398
#   DEF        file:/opt/fhem/python/data2024-11-10_10-43-03.json
#   FUUID      67309b2d-f33f-a625-301d-a6751c6ebcf6ab2c
#   NAME       PVJSON
#   NEXT       2024-11-10 13:00:00
#   NR         227
#   SOURCE     /opt/fhem/python/data2024-11-10_10-43-03.json (36760)
#   STATE      ???
#   SVN        28481 2024-02-05 22:14:33 UTC
#   TYPE       JsonMod
#   eventCount 12
#   CONFIG:
#     IN_REQUEST 0
#     SOURCE     file:/opt/fhem/python/data2024-11-10_10-43-03.json
#     SECRET:
#   READINGS:
#     2024-11-10 12:57:47   Time           
#
setstate PVJSON 2024-11-10 12:57:47 .computedReadings Time
setstate PVJSON 2024-11-10 12:57:47 Time

Die Datei fängt ja so an (sensible info durch $ ersetzt):

{
    "info": {
        "powerstation_id": "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
        "time": "11/10/2024 10:43:03",
        "date_format": "yyyy/MM/dd",
        "date_format_ym": "yyyy/MM",
        "stationname": "$$$$$$$$$$$$$",
        "address": "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
        "owner_name": "$$$$$$$$$$$$$$$$$$$$$$$$",
        "owner_phone": "",
        "owner_email": "$$$$$$$$$$$$$$$$$$$$$$$$",

dann müsste doch das erste time-Element über '$[info][time]' angesprochen werden können?

wowogiengen

Hallo,
ich weiß, warum es nie ging...
true und false mag das tool nicht, ebenso null...

aber wie kann ich das in python ersetzen?

JoWiemann

Hm, warum holst Du die JSON aus der API nicht direkt mit dem Fhem Modul JsonMod?

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

wowogiengen

Zitat von: JoWiemann am 10 November 2024, 20:22:26Hm, warum holst Du die JSON aus der API nicht direkt mit dem Fhem Modul JsonMod?

Grüße Jörg
Weil die API das nicht hergibt?
Das ist der Code, der mir das Objekt in die Datei schreibt, von der ich es dann wieder mit JsonMod auslese... direkter geht leider nicht

import json
#from config import args
from pygoodwe import SingleInverter, API
from datetime import datetime
import os
import time

def delete_old_json_files(directory, days=7):
    # Calculate the time threshold
    time_threshold = time.time() - (days * 86400)  # 86400 seconds in a day

    # Iterate through the files in the specified directory
    for filename in os.listdir(directory):
        file_path = os.path.join(directory, filename)

        # Check if it's a file and has a .json extension
        if os.path.isfile(file_path) and filename.endswith('.json'):
            # Get the last modification time of the file
            file_mod_time = os.path.getmtime(file_path)

            # If the file is older than the threshold, delete it
            if file_mod_time < time_threshold:
                print(f"Deleting file: {file_path}")  # Optional: print the file being deleted
                os.remove(file_path)

# Example usage

#print("Single Inverter")
gw = SingleInverter(
        system_id='...',
        account='...',
        password='...',
        )
# print("Grabbing data")
gw.getCurrentReadings()

# Specify the filename
# Get the current date and time
now = datetime.now()

# Format the date and time
# You can customize the format as needed
filename = now.strftime("/opt/fhem/python/data%Y-%m-%d_%H-%M-%S") + ".json"
print(filename)
data = gw.data
# Open the file in write mode
with open(filename, 'w') as file:
    # Use json.dump to write the data to the file
    json.dump(data, file, indent=2)  # indent=4 for pretty printing

directory_path = '/opt/fhem/python'
delete_old_json_files(directory_path, days=7)


exit(len(data))

tobi01001

Also laut https://community.goodwe.com/solution/GOODWE%20API unterstützt die API json und yaml.

Da musst du wahrscheinlich nicht über ein python script gehen.
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

Prof. Dr. Peter Henning

Zitat von: wowogiengen am 10 November 2024, 20:26:20Weil die API das nicht hergibt?
Unsinn, selbstverständlich tut _das_ API das. Das ist einfach eine REST-Schnittstelle, die mit PUT/GET Requests angesteuert werden kann. Dafür wird kein Python-Skript benötigt.

LG

pah

wowogiengen

Zitat von: Prof. Dr. Peter Henning am 11 November 2024, 18:47:53
Zitat von: wowogiengen am 10 November 2024, 20:26:20Weil die API das nicht hergibt?
Unsinn, selbstverständlich tut _das_ API das. Das ist einfach eine REST-Schnittstelle, die mit PUT/GET Requests angesteuert werden kann. Dafür wird kein Python-Skript benötigt.

LG

pah


Ich hab hier halt ein bereits fertiges python Modul, was das für mich erledigt... Wie das Modul dann an die Daten kommt ist mir wurst... Innerhalb von python bekomme ich die Daten dann als JSON Objekt geliefert, was ich zunächst in eine Datei schreibe.

Ich habe heute aber gesehen, dass jemand im Forum den Goodwe-Wechselrichter auch bereits über Modbus TCP ausgelesen hat. Das werde ich jetzt auch anvisieren, aber dazu brauche ich den 2.0er LAN/Wifi-Adapter...

Viele Grüße
Wolfgang

Prof. Dr. Peter Henning

Zitat von: wowogiengen am 11 November 2024, 20:06:57Innerhalb von python bekomme ich die Daten dann als JSON Objekt geliefert, was ich zunächst in eine Datei schreibe.
Zitat... direkter geht leider nicht
Pardon, aber da kann ich nur den Kopf schütteln. Selbstverständlich könnte man das aus einem Python-Skript direkt an FHEM übergeben.

Aber, wir sind ein freies Land, jeder kann das so umständlich lösen, wie er möchte.

pah

betateilchen

Die weitere Diskussion zum Thema wird bereits hier geführt:

https://forum.fhem.de/index.php?topic=139752.0

Denn offenbar ist auch das Verschieben eine freie Willens- und keine Vernunftentscheidung.
Man macht lieber einen weiteren Thread auf...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

wowogiengen

Also langsam reicht es mir...

Prof. Dr. Peter Henning wirft mir vor umständlich zu programmieren...

mag ja sein, dass es umständlich ist, aber ich bin Anfänger, was perl, python, fhem angeht, deshalb versuche ich das Problem erstmal so zu lösen, wie ich denke, dass es geht.
Ich habe auch erst vor ein paar Tagen rausgefunden, dass es ein paar Module gibt, die mir helfen können, das Problem schneller zu lösen, aber soll ich jetzt alles fallen lassen, nur um mit dem neuen Modul wieder neue Probleme zu bekommen, die ich dann auch wieder umständlich versuche zu lösen?

Auch betateilchens Kommentar finde ich überflüssig.

Für mich sind das immer noch zwei verschiedene Baustellen.

Ich hätte hier im Forum lieber kurze Threads, die einfacher zu durchforsten sind, und wo man nicht vom Thema abweicht...

Ich schliesse das Thema hier, da ich keine weitere zielführende Antwort erwarte.