Seite 11 von 19

Re: SENEC Modul

Verfasst: Di Sep 05, 2023 3:15 pm
von LadY
Hallo Heinz-Jörg,
Ich denke, dass es funktionieren sollte. Du musst nur zusätzlich in der Open-WB-Oberfläche in allen Modulen, wo die _senec Variablen übergeben werden, „none“ (kleingeschrieben) an allen Stellen eingeben, wo Wh verlangt werden, Beispiel ist angehängt.
IMG_2364.jpeg
Das kommt je 2x im Speicher und EVU-Modul vor und 1x im PV-Modul.
Ich hoffe sogar, dass damit auch der Hausverbrauch automatisch berechnet wird und Solarladen vollständig funktioniert. Mein Update auf https ist aber noch nicht da, daher kann ich es selbst nicht testen, allerdings habe ich die „none“ schon eingegeben und beobachte, dass die errechneten Werte nur wenig mit den bei mir noch vorhandenen Statistic-Werten des Senec auseinanderlaufen.
Viele Grüße
Yvonne

Re: SENEC Modul

Verfasst: Di Sep 05, 2023 8:01 pm
von solarjunkie
Also bei mir funktioniert der Hausverbrauch und das PV Laden nach der Umstellung auf HTTPS auch ohne die Werte aus der Statistik-Sektion.

VG

Re: SENEC Modul

Verfasst: Di Sep 05, 2023 8:12 pm
von cjungde
Hallo zusammen,

ich habe auch meine aktuelle 1.9 auf der OpenWB angepasst und folgende Werte auf 'none' gestellt:

EVU:
Vollständige URL für den Wh Bezug
Vollständige URL für die Wh Einspeisung

Bat:
Import Wh URL
Export Wh URL

PV:
habe ich direkt auf Fronius geändert.

Das Ergebnis sieht sehr gut aus !!
Ich habe einen Hausverbrauch und einen SENEC Batteriestatus.
Danke für die Rückmeldungen
Christoph

Re: SENEC Modul

Verfasst: Mi Sep 06, 2023 10:22 am
von matzeeg3
Für alle deren Senec Speicher schon auf HTTPS Umgestellt wurde, hier das Script mit HTTPS:
import struct
import json
import urllib2
import time
import ssl


ipaddress = "SENECIP"
debug = False

#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:
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=ssl._create_unverified_context())
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,2)

#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,2)
if not (jsondata['PM1OBJ1'] ['U_AC'] [1] is None):
writeVal('/var/www/html/openWB/ramdisk/evuv2', jsondata['PM1OBJ1'] ['U_AC'] [1],0,2)
if not (jsondata['PM1OBJ1'] ['U_AC'] [2] is None):
writeVal('/var/www/html/openWB/ramdisk/evuv3', jsondata['PM1OBJ1'] ['U_AC'] [2],0,2)

#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.88 >> 1.67
if not (jsondata['PM1OBJ1'] ['I_AC'] [0] is None):
writeVal('/var/www/html/openWB/ramdisk/bezuga1_senec', jsondata['PM1OBJ1'] ['I_AC'] [0],0,2)
if not (jsondata['PM1OBJ1'] ['I_AC'] [1] is None):
writeVal('/var/www/html/openWB/ramdisk/bezuga2_senec', jsondata['PM1OBJ1'] ['I_AC'] [1],0,2)
if not (jsondata['PM1OBJ1'] ['I_AC'] [2] is None):
writeVal('/var/www/html/openWB/ramdisk/bezuga3_senec', jsondata['PM1OBJ1'] ['I_AC'] [2],0,2)

#Batteriedaten:
reqdata='{"ENERGY":{"GUI_BAT_DATA_FUEL_CHARGE":"","GUI_BAT_DATA_POWER":"","GUI_BAT_DATA_VOLTAGE":"","GUI_BAT_DATA_OA_CHARGING":"","GUI_INVERTER_POWER":""}}'
response = urllib2.urlopen('https://'+ ipaddress +'/lala.cgi' ,data=reqdata, context=ssl._create_unverified_context())
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)

Re: SENEC Modul

Verfasst: Mi Sep 06, 2023 3:25 pm
von Hefer
Hier mal noch eine interessante Betrachtungsweise

https://solectrus.de/blog/2023-09-06-er ... ec-update/

Grüße
Heinz-Jörg

Re: SENEC Modul

Verfasst: Do Sep 07, 2023 8:46 am
von matzeeg3
Für alle die auf openWB 1.9 sind ich habe mal das script etwas umgeschrieben.
Danke an cjungde:

Code: Alles auswählen

import struct
import json
import urllib.request
import time
import ssl
import paho.mqtt.client as mqtt

ipaddress = "senecip"
broker_address = "openwbip or localhost"
broker_port = 1883
debug = False

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

client = mqtt.Client()
# Verbinden mit dem Broker
client.connect(broker_address, broker_port)

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(stringValue, multiplier, decimalpoints):

#Parameter
#filePath:              Pfad und Dateiname in der 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 val is None:
        val = 0

    return val

#EVU Daten
reqdata = '{"PM1OBJ1":{"FREQ":"","U_AC":"","I_AC":"","P_AC":"","P_TOTAL":""}}'
reqdata = bytes(reqdata, 'utf-8')
response = urllib.request.urlopen('https://' + ipaddress + '/lala.cgi', data=reqdata, context=ssl._create_unverified_context())
jsondata = json.load(response)



#SENEC: Gesamtleistung (W) Werte -3000  >> 3000
if not (jsondata['PM1OBJ1'] ['P_TOTAL'] is None):
    topic = "openWB/set/evu/W"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['P_TOTAL'],0,0))


#SENEC: Frequenz(Hz) Werte 49.00 >> 50.00
if not (jsondata['PM1OBJ1'] ['FREQ'] is None):
    topic = "openWB/set/evu/HzFrequenz"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['FREQ'],0,2))

#SENEC: Spannung (V) Werte 219.12 >> 223.43
if not (jsondata['PM1OBJ1'] ['U_AC'] [0] is None):
    topic = "openWB/set/evu/VPhase1"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['U_AC'] [0],0,2))
if not (jsondata['PM1OBJ1'] ['U_AC'] [1] is None):
    topic = "openWB/set/evu/VPhase2"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['U_AC'] [1],0,2))
if not (jsondata['PM1OBJ1'] ['U_AC'] [2] is None):
    topic = "openWB/set/evu/VPhase3"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['U_AC'] [2],0,2))

#SENEC: Leistung (W) Werte -2345 >> 3000
if not (jsondata['PM1OBJ1'] ['P_AC'] [0] is None):
    topic = "openWB/set/evu/WPhase1"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['P_AC'] [0],0,0))
if not (jsondata['PM1OBJ1'] ['P_AC'] [1] is None):
    topic = "openWB/set/evu/WPhase2"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['P_AC'] [1],0,0))
if not (jsondata['PM1OBJ1'] ['P_AC'] [2] is None):
    topic = "openWB/set/evu/WPhase3"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['P_AC'] [2],0,0))


#SENEC: Strom (A) Werte 0.88 >> 1.67
if not (jsondata['PM1OBJ1'] ['I_AC'] [0] is None):
    topic = "openWB/set/evu/APhase1"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['I_AC'] [0],0,2))
if not (jsondata['PM1OBJ1'] ['I_AC'] [1] is None):
    topic = "openWB/set/evu/APhase2"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['I_AC'] [1],0,2))
if not (jsondata['PM1OBJ1'] ['I_AC'] [2] is None):
    topic = "openWB/set/evu/APhase3"
    client.publish(topic, writeVal(jsondata['PM1OBJ1'] ['I_AC'] [2],0,2))

#Batteriedaten:
reqdata='{"ENERGY":{"GUI_BAT_DATA_FUEL_CHARGE":"","GUI_BAT_DATA_POWER":"","GUI_BAT_DATA_VOLTAGE":"","GUI_BAT_DATA_OA_CHARGING":"","GUI_INVERTER_POWER":""}}'
reqdata = bytes(reqdata, 'utf-8')
response = urllib.request.urlopen('https://' + ipaddress + '/lala.cgi', data=reqdata, context=ssl._create_unverified_context())
jsondata = json.load(response)

#SENEC: Batterieleistung (W) Werte -345 (Entladen) >> 1200 (laden)
if not (jsondata['ENERGY'] ['GUI_BAT_DATA_POWER'] is None):
    topic = "openWB/set/houseBattery/W"
    client.publish(topic, writeVal(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):
    topic = "openWB/set/houseBattery/%Soc"
    client.publish(topic, writeVal(jsondata['ENERGY'] ['GUI_BAT_DATA_FUEL_CHARGE'],0,0))

#SENEC: Leistung Wechselrichter in (W) Werte
if not (jsondata['ENERGY'] ['GUI_INVERTER_POWER'] is None):
    topic = "openWB/set/pv/1/W"
    client.publish(topic, writeVal(jsondata['ENERGY'] ['GUI_INVERTER_POWER'],0,0))

# Client beenden
client.disconnect()
so müssen keine daten mehr auf http abfrage gestellt werden sondern das script egal ob auf der openwb ausgeführt oder wo anders sendet die daten via mqtt direkt an die openwb. Damit ist auch keine RAMdisk mehr nötig.
Im nächsten Step werde ich noch die Berechnung der kWh mit einbauen, das dauert aber leide noch ein paar Tage.

Re: SENEC Modul

Verfasst: Do Sep 07, 2023 3:28 pm
von solarjunkie
Hefer hat geschrieben: Mi Sep 06, 2023 3:25 pm Hier mal noch eine interessante Betrachtungsweise

https://solectrus.de/blog/2023-09-06-er ... ec-update/

Grüße
Heinz-Jörg
Danke für den Link! Sehr aufschlussreich.

Re: SENEC Modul

Verfasst: Do Sep 07, 2023 11:01 pm
von TorstenFranz
Hallöchen!! - Ich weis nicht ob ich hier richtig bin:

Ich habe den Senec V2 (FW 825 / GUI 966)
Als PV eine SolarEdge-5000
und steuere mit der OpemWB die EVSE-Wifi an.
Das Ganze nutze ich jetzt schon etwa 3 Jahre ohne größere Probleme.

Seit gestern Mittag geht nichts mehr. Die OpenWB scheint regelrecht stehen geblieben zu sein. Es werden keinerlei Werte aktualisiert. Uhrzeit und Datum sind ebenfalls stehen geblieben.
Der RasperryPi3 läuft aber normal. Die Systemdaten werden richtig angezeigt und er aktualisiert auch die Belastungsdaten im Sekundentakt.

Ich vermute es liegt am Senec, da bisher alle Schwierigkeiten von da kamen. Ich weis es aber nicht.
Ich bräuchte echt Hilfe, da ich auch Schwierigkeiten mit der Programierung habe und eigentlich nur nachmachen kann was hier beschrieben wird.
Damals bei der Ersteinrichtung 2020 hat das gut geklappt und seither lief es fast Fehlerfrei.

Die SD-Karte habe ich mit einem Backup neu bespielt. - keine Änderung des Problems.
Was auch auffällt, er macht das UpDate nicht auf 1.9.303.0 , obwohl ich es angeschoben habe. Er scheint zu Updaten, danach wird aber wieder die Version 1.9.244 angezeigt.

Kann mir jemand Helfen? Liegt das Überhaupt am Senec - es soll ja bei Senec ein UpDat gegeben haben.
Es kann auch sein ich bin hier falsch.

Danke
Torsten

Re: SENEC Modul

Verfasst: Fr Sep 08, 2023 5:16 am
von matzeeg3
Moin Torsten,
Ich glaube nicht das es am senec liegt. Als bei mir das Seneca Update kam, hatte ich zwar keine Power Werte vom Seneca mehr in openwb aber meine 2te PV lief einwandfrei auch Sofortladen und die Uhrzeit ist nicht stehen geblieben. Ehrlich gesagt klingt das nach etwas anderem. Kannst du denn sofort laden? Weil diese Werte müssten auf jeden Fall auftauchen. Kannst du das Senec Script im cron mal deaktivieren nicht das dies durch den Fehler zu viele resourcen verbraucht (nur ein Strohhalm was es sein könnte)

Re: SENEC Modul

Verfasst: Fr Sep 08, 2023 5:37 am
von LadY
Guten Morgen,
Mein Update kam gestern und führte zum gleichen Fehlerbild, also dass Uhrzeit etc eingefroren war und sich gar nichts mehr aktualisiert hat in der OpenWB-Anzeige…
Ich habe dann die Änderungen im Code und der Modulkonfiguration nachgezogen, wie ein paar Einträge vorher auch beschrieben (SSL/https/Statistic+“none“). Damit funktionierte die Wiederbelebung.
Viele Grüße
Yvonne