Seite 4 von 8

Re: SMA Energy Meter als Verbraucher

Verfasst: Mi Mai 19, 2021 8:13 pm
von ALDI-Tuete
Hallo Oliver,

der Stand ist schon recht alt, da ist die Unterscheidung der verschiedenen Konstellationen nicht enthalten.
Das war auch mein erster Versuch mit Github.

Die generelle Struktur mit der Endlosschleife (while True:) ist allerdings noch drin, das habe ich mir von den anderen Modulen abgeschaut.
Das kann ich aber natürlich problemlos rausnehmen.

Auf jeden Fall funktioniert das Modul soweit zuverlässig, ich schaue regelmäßig mal auf die ret-Datei und das passt.
Bei mir senden halt 3 EnergyMeter, dementsprechend ist schon ab und an auch mal kurz eine ret-Datei mit power=0 drin.

Ich bin aktuell nicht zu Hause und mein VPN läuft gerade nicht :-/ Spätestens am Dienstag bin ich wieder zu Hause und poste mal meinen aktuellen Code.
Oder ich bekomme mein VPN noch auf die Beine... :-)

Re: SMA Energy Meter als Verbraucher

Verfasst: Mi Mai 19, 2021 8:24 pm
von okaegi
Was du vielleicht auch hinkriegst das du solange wartest, bist das du wieder einen Wert empfängst ? Ich würde dann zur sicherheit ein Abbruchkriterium einbauen (z.b c
Counter =0
Power = 0
While true
Counter = counter + 1
If counter > 5000 then:
Break
if Meldung recieved then
Break

Re: SMA Energy Meter als Verbraucher

Verfasst: Mi Mai 19, 2021 8:29 pm
von ALDI-Tuete
Ich warte bereits :-) Ich nutze hierzu das letzte Änderungsdatum der ret-Datei und schreibe nur eine power=0 ret-Datei wenn das letzte Änderungsdatum (ich glaube) mindestens 60 Sekunden in der Vergangenheit liegt.
Ich habe bei mir ja das Szenario das der EnergyMeter meiner Wärmepumpe stundenlang auch mal nichts schickt und dann aber auch 3 EMs parallel senden können.
Ein Himmelreich für ein funktionierendes VPN... :-D

Re: SMA Energy Meter als Verbraucher

Verfasst: Mi Mai 26, 2021 4:48 am
von ALDI-Tuete
So, hier ist mein aktueller Code:
Ich loope ewig mit dem "while True:" - das habe ich vom Bezugsmodul übernommen.
Ich kann natürlich auch nur einmal je Aufruf von watt.py die Werte ermitteln.
Was ist denn der korrekte Weg für ein Smarthome-Modul?

Danke!

Gruß
Markus

#!/usr/bin/python3
# coding=utf-8
import sys
import os
import time
import getopt
import binascii
import json
import signal
import sys
import socket
import struct
from speedwiredecoder import *

# clean exit
def abortprogram(signal,frame):
# Housekeeping -> nothing to cleanup
print('STRG + C = end program')
sys.exit(0)

# abort-signal
signal.signal(signal.SIGINT, abortprogram)

#read configuration
#default values
devicenumber = str(sys.argv[1]) # SmartHomeDevice-Nummer
smaserial = sys.argv[2] # SMA EnergyMeter Serial number
ipbind = '0.0.0.0'
MCAST_GRP = '239.12.255.254'
MCAST_PORT = 9522

returnfile = '/var/www/html/openWB/ramdisk/smarthome_device_ret' + str(devicenumber)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', MCAST_PORT))
try:
mreq = struct.pack("4s4s", socket.inet_aton(MCAST_GRP), socket.inet_aton(ipbind))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
except BaseException:
print('Could not connect to multicast group or bind to given interface')
sys.exit(1)

if os.path.isfile(returnfile):
lastmodificationtime=os.path.getmtime(returnfile)
else:
lastmodificationtime=time.time()

# Processing received messages
# The SMA EnergyMeter does not send any data package if there is no Power Consumption / no data to send
# Therefore we have to do a special processing for this scenario.
# We also have to take care if there are more than one EnergyMeter in the network sending, that's why we check the modification time in scenario 2.
# Without this check we would generate a ret-file everytime we receive data from a not desired EnergyMeter.
while True:
emparts={}
emparts=decode_speedwire(sock.recv(608))

if smaserial is None or smaserial == 'none' or str(emparts['serial']) == smaserial: # Scenario 1: Our EnergyMeter is sending, so we put the current values in our output variables
watt=str(int(emparts.get("pconsume")))
wattc=str("{:.3f}".format(emparts.get('pconsumecounter')))
elif (os.path.isfile(returnfile)) and ((time.time()-lastmodificationtime) > 60): # Scenario 2: Our EnergyMeter is not sending but do we have a returnfile which is older than 60 seconds?
# We have a ret-file which is older than 60 seconds so we create a "fake" ret-file.
# We set "0" as current Power Consume (pconsume) and (from the existing ret-file) the last value for the Power Consume Counter (pconsumecounter)
# Yes, returnfile exists
watt='0'
ret=open(returnfile, 'r')
lastvalues = ret.read()
ret.close()
wattc = lastvalues[int(lastvalues.rfind('powerc')) + 8:lastvalues.find('}')]
else:
# Our EnergyMeter is not sending right now and it didn't send any data since boottime
# In this case we do nothing and we don't create a "fake" returnfile
sys.exit("Module SMAEM: No data received and no historical data since boottime")
# general output section
answer = '{"power":' + watt + ',"powerc":' + wattc + '}'
f = open(returnfile, 'w')
f.write(answer)
f.close

Re: SMA Energy Meter als Verbraucher

Verfasst: Do Mai 27, 2021 8:04 pm
von Poellph
wäre es für euch ein großer Aufwand, die Funktion auch in „Smart Home“ und nicht nur in „Smart Home 2.0“ zu implementieren?!

Wäre euch super dankbar.

Re: SMA Energy Meter als Verbraucher

Verfasst: Fr Mai 28, 2021 6:57 am
von ALDI-Tuete
Ich habe mit dem Smarthome-Bereich noch nichts gemacht. Ist nicht Smarthome 2.0 die Zukunft bzw. welchen Grund gibt es denn Smarthome 2.0 nicht zu verwenden?

Re: SMA Energy Meter als Verbraucher

Verfasst: Fr Mai 28, 2021 7:01 am
von ALDI-Tuete
Nebenbei: Hat sich im Smarthome 2.0 etwas geändert?
Ich habe ein Update auf die beta 1.9.235 gemacht und seitdem erhalte ich im smarthome.log bis dato unbekannte Fehlermeldungen (ich habe mich ja in we514 reingehängt):
2021-05-28 08:54:54: Leistungsmessung we514 1 TestSMAEM Fehlermeldung: the JSON object must be str, bytes or bytearray, not dict
2021-05-28 08:54:54: Device none1TestSMAEM Fehlermeldung: error in sepwatt

Die smarthome_device_ret1 hat -wie vorher- diesen Inhalt: {"power":5,"powerc":6822.069}

Re: SMA Energy Meter als Verbraucher

Verfasst: Fr Mai 28, 2021 7:04 am
von okaegi
ALDI-Tuete hat geschrieben: Mi Mai 26, 2021 4:48 am So, hier ist mein aktueller Code:
Ich loope ewig mit dem "while True:" - das habe ich vom Bezugsmodul übernommen.
Ich kann natürlich auch nur einmal je Aufruf von watt.py die Werte ermitteln.
Was ist denn der korrekte Weg für ein Smarthome-Modul?



Gruß
Markus
Lass mich mal sehen:
Du brauchst als Parameter nur die Serial number, das war ich glaub ein Textstring, oder ?
devicenumber = str(sys.argv[1]) # SmartHomeDevice-Nummer
smaserial = sys.argv[2] # SMA EnergyMeter Serial number
Bitte nur einmal pro watt.py aufruf Werte ermitteln, und das Programm dann verlassen.
Kannst du mir das dann nach test als watt.py emailen.
Gruss Oluver

Re: SMA Energy Meter als Verbraucher

Verfasst: Fr Mai 28, 2021 7:07 am
von okaegi
ALDI-Tuete hat geschrieben: Fr Mai 28, 2021 7:01 am Nebenbei: Hat sich im Smarthome 2.0 etwas geändert?
Ich habe ein Update auf die beta 1.9.235 gemacht und seitdem erhalte ich im smarthome.log bis dato unbekannte Fehlermeldungen (ich habe mich ja in we514 reingehängt):
2021-05-28 08:54:54: Leistungsmessung we514 1 TestSMAEM Fehlermeldung: the JSON object must be str, bytes or bytearray, not dict
2021-05-28 08:54:54: Device none1TestSMAEM Fehlermeldung: error in sepwatt

Die smarthome_device_ret1 hat -wie vorher- diesen Inhalt: {"power":5,"powerc":6822.069}
Sollte als json geschrieben werden:
aktpower = 0
powerc = 0
answer = '{"power":' + str(aktpower) + ',"powerc":' + str(powerc) + ',"on":' + str(pvmodus) + '} '
f1 = open('/var/www/html/openWB/ramdisk/smarthome_device_ret' + str(devicenumber), 'w')
json.dump(answer,f1)
f1.close()

Re: SMA Energy Meter als Verbraucher

Verfasst: Fr Mai 28, 2021 7:08 am
von okaegi
ALDI-Tuete hat geschrieben: Fr Mai 28, 2021 6:57 am Ich habe mit dem Smarthome-Bereich noch nichts gemacht. Ist nicht Smarthome 2.0 die Zukunft bzw. welchen Grund gibt es denn Smarthome 2.0 nicht zu verwenden?
smarthome 2.0 ist die Zukunft.
Gruss Oliver