SENEC Modul

Anfragen zum Erstellen von Modulen, Fragen zu Modulen
matzeeg3
Beiträge: 40
Registriert: Fr Mai 07, 2021 6:33 am

Re: SENEC Modul

Beitrag von matzeeg3 »

TorstenFranz hat geschrieben: So Sep 10, 2023 7:57 pm Hallo Team!

Ich habe leider nicht diese Erfahrung und dieses Wissen im Programmieren wie ihr. Ich habe 2020 einfach nach Anleitung von cjungde, wie sie am Anfang dieses Senec-Modul-Themas beschrieben ist, abgeschrieben. Seither hat alles super funktioniert.
Seit dem UpDate von Senec geht nun nichts mehr.
Ich kann leider nicht zuordnen wo ihr diese ganzen Änderungen getätigt habt.

Es wäre echt super wenn jemand von euch eine "Schritt für Schritt Anleitung" hier reinsetzen könnte, wie man OpenWB mit dem Senec wieder zum Laufen bekommt.

Ich wäre echt Dankbar.
LG
Torsten
Moin Torsten, hast du das Scipt angepasst?:
cjungde hat geschrieben: Sa Sep 02, 2023 3:49 pm Hallo Yvonne,

willkommen im Forum und vielen Dank für Deine Anregungen.

Ich habe den code für die 1.9 analog zu Deinen Vorschlägen angepasst. Dann läuft die OpenWB V1 erstmal wieder. Aber eine Lösung für den Hausverbrauch geht dann erst über die sim.counter in den neuen modulen. Im Prinzip sind die Module der V2 auch in der V1 nutzbar, das muss man nur erstmal testen, weil der ganze Aufruf anders abläuft.

Code: Alles auswählen

#!/usr/bin/python

import struct
import json
import urllib2
import ssl
import time


ipaddress = "192.168.XXX.YYY"
debug = False


ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

#ipaddress = str(sys.argv[1])


def myDecode(stringValue):
# Parameter: 
# stringValue:	String Wert, im Format Typ_Wert 
# 
# Rueckgabe:
# result: 		Floatzahl
    splitValue = stringValue.split('_')

    if splitValue[0] == 'fl':
        #Hex >> Float
        result = struct.unpack('f',struct.pack('I',int('0x'+splitValue[1],0)))[0]
    elif splitValue[0] == 'u3': 
        pass #TBD
    elif splitValue[0] == 'u8':
        pass #TBD
    
    return result

def writeVal(filePath,stringValue,multiplier,decimalpoints):

#Parameter
#filePath: 		Pfad und Dateiname in der ein Wert geschrieben wird
#stringValue: 	Wert der nach dem knonvertieren in die Datei geschrieben wird
#multiplier: 	Wert mit dem die Zahl vor der Rundung multipliziert wird
#decimalpoints:	Anzahl Kommastellen 
#
#Rueckgabe: nichts

    val= myDecode(stringValue)

	# Format anpassen
    if multiplier != 0:
        val = val * multiplier

    #auf 2 Ziffern runden
    if decimalpoints == 0:
        val = int(val)
    elif decimalpoints != 0:
        val = round(val,decimalpoints)

    if debug:
        print(filePath + ' ' + str(val))
    else:
        print(filePath + ' ' + str(val))
        f = open(filePath, 'w')
        f.write(str(val))
        f.close()

#EVU Daten
reqdata='{"PM1OBJ1":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}}'
response = urllib2.urlopen('https://'+ ipaddress +'/lala.cgi' ,data=reqdata, context=ctx)
jsondata = json.load(response)
#keine Werte gefunden
# echo $evupf1 > /var/www/html/openWB/ramdisk/evupf1
# echo $evupf2 > /var/www/html/openWB/ramdisk/evupf2
# echo $evupf3 > /var/www/html/openWB/ramdisk/evupf3

#SENEC: Gesamtleistung (W) Werte -3000  >> 3000
if not (jsondata['PM1OBJ1'] ['P_TOTAL'] is None):
    writeVal('/var/www/html/openWB/ramdisk/wattbezug_senec', jsondata['PM1OBJ1'] ['P_TOTAL'],0,0)

#SENEC: Frequenz(Hz) Werte 49.00 >> 50.00
if not (jsondata['PM1OBJ1'] ['FREQ'] is None):
    writeVal('/var/www/html/openWB/ramdisk/evuhz',jsondata['PM1OBJ1'] ['FREQ'],0,0)

#SENEC: Spannung (V) Werte 219.12 >> 223.43
if not (jsondata['PM1OBJ1'] ['U_AC'] [0] is None):
    writeVal('/var/www/html/openWB/ramdisk/evuv1', jsondata['PM1OBJ1'] ['U_AC'] [0],0,0)
if not (jsondata['PM1OBJ1'] ['U_AC'] [1] is None):
    writeVal('/var/www/html/openWB/ramdisk/evuv2', jsondata['PM1OBJ1'] ['U_AC'] [1],0,0)
if not (jsondata['PM1OBJ1'] ['U_AC'] [2] is None):
    writeVal('/var/www/html/openWB/ramdisk/evuv3', jsondata['PM1OBJ1'] ['U_AC'] [2],0,0)

#SENEC: Leistung (W) Werte -2345 >> 3000
if not (jsondata['PM1OBJ1'] ['P_AC'] [0] is None):
    writeVal('/var/www/html/openWB/ramdisk/bezugw1', jsondata['PM1OBJ1'] ['P_AC'] [0],0,0)
if not (jsondata['PM1OBJ1'] ['P_AC'] [1] is None):
    writeVal('/var/www/html/openWB/ramdisk/bezugw2', jsondata['PM1OBJ1'] ['P_AC'] [1],0,0)
if not (jsondata['PM1OBJ1'] ['P_AC'] [2] is None):
    writeVal('/var/www/html/openWB/ramdisk/bezugw3', jsondata['PM1OBJ1'] ['P_AC'] [2],0,0)

#SENEC: Strom (A) Werte 0 >> 1 
if not (jsondata['PM1OBJ1'] ['I_AC'] [0] is None):
    writeVal('/var/www/html/openWB/ramdisk/bezuga1_senec', jsondata['PM1OBJ1'] ['I_AC'] [0],0,0)
if not (jsondata['PM1OBJ1'] ['I_AC'] [1] is None):    
    writeVal('/var/www/html/openWB/ramdisk/bezuga2_senec', jsondata['PM1OBJ1'] ['I_AC'] [1],0,0)
if not (jsondata['PM1OBJ1'] ['I_AC'] [2] is None):    
    writeVal('/var/www/html/openWB/ramdisk/bezuga3_senec', jsondata['PM1OBJ1'] ['I_AC'] [2],0,0)

#Batteriedaten:
reqdata='{"ENERGY":{"GUI_BAT_DATA_FUEL_CHARGE":"","GUI_BAT_DATA_POWER":"","GUI_BAT_DATA_VOLTAGE":"","GUI_INVERTER_POWER":""}}'
response = urllib2.urlopen('https://'+ ipaddress +'/lala.cgi' ,data=reqdata, context=ctx)
jsondata = json.load(response)

#SENEC: Batterieleistung (W) Werte -345 (Entladen) >> 1200 (laden)
if not (jsondata['ENERGY'] ['GUI_BAT_DATA_POWER'] is None):
    writeVal('/var/www/html/openWB/ramdisk/speicherleistung_senec', jsondata['ENERGY'] ['GUI_BAT_DATA_POWER'],0,0)

#SENEC: Fuellmenge in Prozent Werte 10 >> 55 >> 100
if not (jsondata['ENERGY'] ['GUI_BAT_DATA_FUEL_CHARGE'] is None):
    writeVal('/var/www/html/openWB/ramdisk/speichersoc_senec', jsondata['ENERGY'] ['GUI_BAT_DATA_FUEL_CHARGE'],0,0)

#SENEC: Leistung Wechselrichter in (W) Werte 
if not (jsondata['ENERGY'] ['GUI_INVERTER_POWER'] is None):
    writeVal('/var/www/html/openWB/ramdisk/pvwatt_senec', jsondata['ENERGY'] ['GUI_INVERTER_POWER'],0,0)

matzeeg3
Beiträge: 40
Registriert: Fr Mai 07, 2021 6:33 am

Re: SENEC Modul

Beitrag von matzeeg3 »

In Gitlab habe ich gerade den Code nochmal Aktualisiert. Hier gibt es nun die Schalter:
evudata = True oder False
und
pvdata = True oder False
TorstenFranz
Beiträge: 46
Registriert: Do Sep 03, 2020 12:24 pm

Re: SENEC Modul

Beitrag von TorstenFranz »

matzeeg3 hat geschrieben: Mo Sep 11, 2023 10:46 am
TorstenFranz hat geschrieben: So Sep 10, 2023 7:57 pm Hallo Team!

Ich habe leider nicht diese Erfahrung und dieses Wissen im Programmieren wie ihr. Ich habe 2020 einfach nach Anleitung von cjungde, wie sie am Anfang dieses Senec-Modul-Themas beschrieben ist, abgeschrieben. Seither hat alles super funktioniert.
Seit dem UpDate von Senec geht nun nichts mehr.
Ich kann leider nicht zuordnen wo ihr diese ganzen Änderungen getätigt habt.

Es wäre echt super wenn jemand von euch eine "Schritt für Schritt Anleitung" hier reinsetzen könnte, wie man OpenWB mit dem Senec wieder zum Laufen bekommt.

Ich wäre echt Dankbar.
LG
Torsten
Moin Torsten, hast du das Scipt angepasst?:
cjungde hat geschrieben: Sa Sep 02, 2023 3:49 pm Hallo Yvonne,

willkommen im Forum und vielen Dank für Deine Anregungen.

Ich habe den code für die 1.9 analog zu Deinen Vorschlägen angepasst. Dann läuft die OpenWB V1 erstmal wieder. Aber eine Lösung für den Hausverbrauch geht dann erst über die sim.counter in den neuen modulen. Im Prinzip sind die Module der V2 auch in der V1 nutzbar, das muss man nur erstmal testen, weil der ganze Aufruf anders abläuft.

Code: Alles auswählen

#!/usr/bin/python

import struct
import json
import urllib2
import ssl
import time


ipaddress = "192.168.XXX.YYY"
debug = False


ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

#ipaddress = str(sys.argv[1])


def myDecode(stringValue):
# Parameter: 
# stringValue:	String Wert, im Format Typ_Wert 
# 
# Rueckgabe:
# result: 		Floatzahl
    splitValue = stringValue.split('_')

    if splitValue[0] == 'fl':
        #Hex >> Float
        result = struct.unpack('f',struct.pack('I',int('0x'+splitValue[1],0)))[0]
    elif splitValue[0] == 'u3': 
        pass #TBD
    elif splitValue[0] == 'u8':
        pass #TBD
    
    return result

def writeVal(filePath,stringValue,multiplier,decimalpoints):

#Parameter
#filePath: 		Pfad und Dateiname in der ein Wert geschrieben wird
#stringValue: 	Wert der nach dem knonvertieren in die Datei geschrieben wird
#multiplier: 	Wert mit dem die Zahl vor der Rundung multipliziert wird
#decimalpoints:	Anzahl Kommastellen 
#
#Rueckgabe: nichts

    val= myDecode(stringValue)

	# Format anpassen
    if multiplier != 0:
        val = val * multiplier

    #auf 2 Ziffern runden
    if decimalpoints == 0:
        val = int(val)
    elif decimalpoints != 0:
        val = round(val,decimalpoints)

    if debug:
        print(filePath + ' ' + str(val))
    else:
        print(filePath + ' ' + str(val))
        f = open(filePath, 'w')
        f.write(str(val))
        f.close()

#EVU Daten
reqdata='{"PM1OBJ1":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}}'
response = urllib2.urlopen('https://'+ ipaddress +'/lala.cgi' ,data=reqdata, context=ctx)
jsondata = json.load(response)
#keine Werte gefunden
# echo $evupf1 > /var/www/html/openWB/ramdisk/evupf1
# echo $evupf2 > /var/www/html/openWB/ramdisk/evupf2
# echo $evupf3 > /var/www/html/openWB/ramdisk/evupf3

#SENEC: Gesamtleistung (W) Werte -3000  >> 3000
if not (jsondata['PM1OBJ1'] ['P_TOTAL'] is None):
    writeVal('/var/www/html/openWB/ramdisk/wattbezug_senec', jsondata['PM1OBJ1'] ['P_TOTAL'],0,0)

#SENEC: Frequenz(Hz) Werte 49.00 >> 50.00
if not (jsondata['PM1OBJ1'] ['FREQ'] is None):
    writeVal('/var/www/html/openWB/ramdisk/evuhz',jsondata['PM1OBJ1'] ['FREQ'],0,0)

#SENEC: Spannung (V) Werte 219.12 >> 223.43
if not (jsondata['PM1OBJ1'] ['U_AC'] [0] is None):
    writeVal('/var/www/html/openWB/ramdisk/evuv1', jsondata['PM1OBJ1'] ['U_AC'] [0],0,0)
if not (jsondata['PM1OBJ1'] ['U_AC'] [1] is None):
    writeVal('/var/www/html/openWB/ramdisk/evuv2', jsondata['PM1OBJ1'] ['U_AC'] [1],0,0)
if not (jsondata['PM1OBJ1'] ['U_AC'] [2] is None):
    writeVal('/var/www/html/openWB/ramdisk/evuv3', jsondata['PM1OBJ1'] ['U_AC'] [2],0,0)

#SENEC: Leistung (W) Werte -2345 >> 3000
if not (jsondata['PM1OBJ1'] ['P_AC'] [0] is None):
    writeVal('/var/www/html/openWB/ramdisk/bezugw1', jsondata['PM1OBJ1'] ['P_AC'] [0],0,0)
if not (jsondata['PM1OBJ1'] ['P_AC'] [1] is None):
    writeVal('/var/www/html/openWB/ramdisk/bezugw2', jsondata['PM1OBJ1'] ['P_AC'] [1],0,0)
if not (jsondata['PM1OBJ1'] ['P_AC'] [2] is None):
    writeVal('/var/www/html/openWB/ramdisk/bezugw3', jsondata['PM1OBJ1'] ['P_AC'] [2],0,0)

#SENEC: Strom (A) Werte 0 >> 1 
if not (jsondata['PM1OBJ1'] ['I_AC'] [0] is None):
    writeVal('/var/www/html/openWB/ramdisk/bezuga1_senec', jsondata['PM1OBJ1'] ['I_AC'] [0],0,0)
if not (jsondata['PM1OBJ1'] ['I_AC'] [1] is None):    
    writeVal('/var/www/html/openWB/ramdisk/bezuga2_senec', jsondata['PM1OBJ1'] ['I_AC'] [1],0,0)
if not (jsondata['PM1OBJ1'] ['I_AC'] [2] is None):    
    writeVal('/var/www/html/openWB/ramdisk/bezuga3_senec', jsondata['PM1OBJ1'] ['I_AC'] [2],0,0)

#Batteriedaten:
reqdata='{"ENERGY":{"GUI_BAT_DATA_FUEL_CHARGE":"","GUI_BAT_DATA_POWER":"","GUI_BAT_DATA_VOLTAGE":"","GUI_INVERTER_POWER":""}}'
response = urllib2.urlopen('https://'+ ipaddress +'/lala.cgi' ,data=reqdata, context=ctx)
jsondata = json.load(response)

#SENEC: Batterieleistung (W) Werte -345 (Entladen) >> 1200 (laden)
if not (jsondata['ENERGY'] ['GUI_BAT_DATA_POWER'] is None):
    writeVal('/var/www/html/openWB/ramdisk/speicherleistung_senec', jsondata['ENERGY'] ['GUI_BAT_DATA_POWER'],0,0)

#SENEC: Fuellmenge in Prozent Werte 10 >> 55 >> 100
if not (jsondata['ENERGY'] ['GUI_BAT_DATA_FUEL_CHARGE'] is None):
    writeVal('/var/www/html/openWB/ramdisk/speichersoc_senec', jsondata['ENERGY'] ['GUI_BAT_DATA_FUEL_CHARGE'],0,0)

#SENEC: Leistung Wechselrichter in (W) Werte 
if not (jsondata['ENERGY'] ['GUI_INVERTER_POWER'] is None):
    writeVal('/var/www/html/openWB/ramdisk/pvwatt_senec', jsondata['ENERGY'] ['GUI_INVERTER_POWER'],0,0)


Danke für deine Hilfe!

Mein Problem ist derzeit, dass ich nicht weis wo ich das Skript hinschreiben muss?

LG
Torsten
matzeeg3
Beiträge: 40
Registriert: Fr Mai 07, 2021 6:33 am

Re: SENEC Modul

Beitrag von matzeeg3 »

Wenn in deiner Modul Konfiguration von der Batterie die IP von der openwb bzw. localhost oder 127.0.0.1 eingetragen ist, dann kannst du dich mit deinem user auf die openwb aufschalten und dort mit sudo crontab -l dir den pfad anzeigen lassen.
cjungde
Beiträge: 117
Registriert: Mo Jan 27, 2020 9:48 pm

Re: SENEC Modul

Beitrag von cjungde »

TorstenFranz hat geschrieben: Di Sep 12, 2023 5:43 am

Danke für deine Hilfe!

Mein Problem ist derzeit, dass ich nicht weis wo ich das Skript hinschreiben muss?

LG
Torsten
Hallo Torsten,
Wenn du der Anleitung im ersten Post gefolgt bist, findest Du das script in
/var/www/html/openWB/modules/_senec

Grüße
Christoph
Heckert 9,9 kWp PV
Fronius Symo 10.0-3-M WR
SENEC Speicher 5 kWh
openWB series2 standard+
Auto: Zoe R110
Restliche Hausautomation: FHEM
matzeeg3
Beiträge: 40
Registriert: Fr Mai 07, 2021 6:33 am

Re: SENEC Modul

Beitrag von matzeeg3 »

Ich hab einmal ein Brach erstellt für die WH / KWH Berechnung via MQTT also ohne RAMDISK.
Ist im Github unter:
https://raw.githubusercontent.com/matze ... c/senec.py
zu finden.
Gerne Testen und Rückmeldung geben.
Meine ToDos:
[*]Error Handling
[*]Script Optimierung
[*]Erweitern des Scripts und der Vatiablen für openWB Software 2 für alle die kein root Zugiff auf die Openwb haben
[*]Erstellung eines Docker Containers, der die aufgaben übernimmt mit ENV - Variablen zur Steuerung
LadY
Beiträge: 6
Registriert: Sa Sep 02, 2023 2:44 pm

Re: SENEC Modul

Beitrag von LadY »

cjungde hat geschrieben: Di Sep 12, 2023 7:59 am
TorstenFranz hat geschrieben: Di Sep 12, 2023 5:43 am

Danke für deine Hilfe!

Mein Problem ist derzeit, dass ich nicht weis wo ich das Skript hinschreiben muss?

LG
Torsten
Hallo Torsten,
Wenn du der Anleitung im ersten Post gefolgt bist, findest Du das script in
/var/www/html/openWB/modules/_senec

Grüße
Christoph
Hallo Torsten,

falls es dir hilft, hier die Langversion:

Eine SSH-Verbindung auf die Open-WB mit Nutzernamen Pi und IP-Adresse
SSH pi@xxx.xxx.xxx.xxx

Dann passwort eingeben

Wechsel in das Senec-Verzeichnis:
Cd /var/www/html/openWB/modules/_senec

Öffnen der Senec-Datei mit dem Nano-Editor:
Nano senec.py

Damit öffnet sich der Code, wenn du es nach ursprünglicher Anleitung installiert hast.

Die Änderungen dort wie von Christoph umgesetzt eingeben

Speichern mit ctrl + O
Beenden mit ctrl + X

Aus der SSH-Verbindung mit exit und Enter wieder abmelden

Meine Wallbox ist direkt danach wieder "aufgewacht".

Viele Grüße
Yvonne
matzeeg3
Beiträge: 40
Registriert: Fr Mai 07, 2021 6:33 am

Re: SENEC Modul

Beitrag von matzeeg3 »

Ich hab den Code im Git Repo nochmal aktuallisiert.
Das Script läuft nun bedeutend schneller.
Damit die Berechneten WH auch passen sollte die Intervall bei 5 belassen werden
TorstenFranz
Beiträge: 46
Registriert: Do Sep 03, 2020 12:24 pm

Re: SENEC Modul

Beitrag von TorstenFranz »

Hallo Team!!

Danke an Alle die mir geholfen haben! :P
Ich finde es beeindruckend wie Ihr das alles macht, diese Skripte entwerfen und so.
Noch lobenswerter finde ich, dass Ihr eure Arbeit einfach so mit anderen Senec-Nutzern teilt!! :!: :!: :!: - Sowas ist heutzutage nicht unbedingt selbstverständlich.

>> Ich konnte dank Eurer Hilfe meine OpenWB auf dem raspberry wieder zum laufen bekommen. Dem Anschein nach läuft auch alles wieder normal. Ich werde das die nächsten Tage mal beobachten.

Auch besonderen Dank an Yvonne, zu der Anleitung, wie ich am einfachsten auf der Raspberry-Oberfläche die Daten einarbeiten kann.

Ihr seit ein tolles Tem hier :!: :!: :!:
Danke
LG
Torsten
aiole
Beiträge: 6895
Registriert: Mo Okt 08, 2018 4:51 pm

Re: SENEC Modul

Beitrag von aiole »

Gehört zwar nicht direkt zu openWB, aber hier hat jemand, für seinen Kollegen einen flow für die Senec-Auslesung in NodeRed gebaut. Scheint allerdings nicht mehr der ganz aktuelle Stand zu sein.
https://m.youtube.com/watch?v=eKMvF-Zjy ... IGJsb2c%3D

Es ist schon anstrengend, wenn ein Hersteller seine Schnittstelle nicht offenlegt :roll: .
Antworten