Moin zusammen.
Ich grätsche hier mal eben schräg von der Seite rein. Ich nutze seit einem halben Jahr diesen Python Code um den Limiter des Soyosource anzusteuern (s.u., einrücken funktioniert hier wohl nicht. ggf. selber nachholen).
Den Powerwert meines aktuellen Bezuges ziehe ich mir über die API von Discovergy, meinem Messstellenbetreiber. Nachteil: Latenzzeit einige Sekunden.
Beim Soyosource ist ja nun schon mal ein Gerät dabei, dass eine Phase misst und quasi mit dem selben Protokoll den Soyosource versorgen könnte.
Meine Idee: 3 davon, also an jeder Phase einen, und die seriellen Ports mit einem Raspberry Pi zu belauschen. Die Power-Werte zähle ich einfach zusammen und lege sie ein eine Text-Datei die im Verzeichnis des Webservers liegt. Somit wäre mein Gesamtverbrauch direkt mit HTML auszulesen und mit einem anderen (oder meinetwegen auch demselben) Pi auszulesen und ich steuere mit meinem Script wieder den Soyosource an. Sollte weniger Latenzzeit benötigen und ich wäre weder von einem funktionierenden Internet noch von meinem Netzbetreiber abhängig.
Soo, nun endlich meine Frage: Hat schon jemand ausgetüftelt wie man, so simpel wie im Code unten, mit Python die drei Seriellen Ports ausließt und die Powerwerte extrahiert?
Vermutlich könnte man die Antwort aus diesem Thread herausdestilieren, ist mir bisher aber so noch nicht gelungen...
Vielen Dank vorab.
def computeCRC(power):
pu = power >> 8
pl = power & 0xFF
return (264 - pu - pl) & 0xFF
def read_consumed_power(ser):
time.sleep(0.1) # Wait and clear input buffer to ensure proper packet synchronization
ser.reset_input_buffer()
try:
raw = ser.read(8) # Read 8 bytes
except: return -1
(a,b,divider,c,consumed_power,d,crc) = struct.unpack('>BBBBHBB', raw)
if computeCRC(consumed_power) != crc: return -2 # Checksum mismatch
return consumed_power
def set_generated_power(ser, power):
a = 0x24
b = 0x56
divider = 0x00
c = 0x21
d = 0x80
crc = computeCRC(power)
out = struct.pack('>BBBBHBB', a,b,divider,c,power,d,crc)
ser.write(out)
ser.flush() # Wait for data to be written out