Einige Fragezeichen in meinem Kopf sind weg, dafür gibt es wieder andere
Da mein Code immer länger wird denke ich es wäre vielleicht sinnvoll in auf mehrere Module auf zu teile z.B. Hauptcode, Abfrage allgemeine Daten, Abfrage ist Temperaturen, Abfrage Solltemperaturen, Abfrage Betriebszustände, Vergleich Soll-Ist-Werte mit Benachrichtigung z.B. auf Smartphone.
Beim Abfragen von Betriebszuständen habe ich im Moment noch keine Ahnung wie ich die Werte die ich vom Regler über die Abfrage der Bitvariablen erhalte brauchbar auswerten kann.
https://1drv.ms/b/s!Aj1wKT5IcL0qkH34MoW ... -?e=1OkBm8 ich hoffe der Link zur Regler-Dokumentation funktioniert so.
Unter Punkt 5.12 ist die Abfrage der Bitvariationen beschrieben. Lieder verstehe ich als Unwissender nicht, was mir das sagen soll
Bezüglich Vergleich Soll-Ist-Werte möchte ich eine Störmeldung auf Smartphone, wenn z.B. die Puffertemperatur nicht den Sollwert erreicht.
Für Hilfe, Tipps, Codevorschläge und Erklärungen (die meinen bescheidenen Programmierhorizont) erweitern bin ich dankbar.
Hier noch der aktuelle Stand meines Codes
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import serial
import sollwerte
import time
import datetime
TEMPERATURFUEHLER = {
1: "Kollektorfühlertemperatur",
2: "Kollekorvorlauftemperatur",
3: "Speicher Oben Temperatur",
4: "Speicher Mitte Temperatur",
5: "Speicher Unten Temperatur",
7: "Kollekorrücklauf Temperatur",
10: "Vorlauftemperatur Heizkreis 1",
11: "Vorlauftemperatur Heizkreis 2",
12: "Zirkulation Rücklauftemperatur",
15: "Holzpelletkessel Temperatur",
16: "Außentemperatur"
}
def send_message(serial, message):
assert len(message) < 256
checksum = -(2 + len(message) + sum(message)) & 0xff
data = bytes([2, len(message)] + message + [checksum])
serial.write(data)
def read_message(serial):
data = serial.read(2)
if data is None:
# timeout
return None
if data[0] != 2:
raise IOError("message-header wrong")
message = serial.read(data[1])
checksum = serial.read(1)
if -sum(data + message) & 0xff != checksum[0]:
raise IOError("checksum wrong")
return message
def call_command(serial, message):
send_message(serial, message)
return read_message(serial)
def reglerkennung(serial):
ans = call_command(serial, [ 0x01 ])
if ans[0] != 0x01:
raise IOError("Wrong answer id")
return int.from_bytes(ans[1:3], byteorder="big")
def versionsnummer(serial):
ans = call_command(serial, [ 0x02 ])
if ans[0] != 0x02:
raise IOError("Wrong answer id")
if len(ans) != 4:
raise IOError("Wrong answer length")
major = int.from_bytes(ans[1:3], byteorder="big")
minor = int(ans[3])
return "V{}.{:02}.{}".format(int(major / 100), major % 100, minor)
def temperaturfuehler(serial, fuehler):
assert fuehler < 17
ans = call_command(serial, [ 0x10, 0x00, fuehler + 4 ])
if ans[0] != 0x10:
raise IOError("Wrong answer id")
if len(ans) != 7:
raise IOError("Wrong answer length")
if int.from_bytes(ans[1:3], byteorder="big") != fuehler + 4:
raise IOError("Wrong var id")
value = int.from_bytes(ans[3:8], signed=True, byteorder="big")
return "{}°C".format(value / 10)
#Vom Regler berechnete Vorlaufsolltemperatur Heizkreis 1 (Heizkörper)
def vorlauf_HK1_soll(serial):
ans = call_command(serial, [ 0x10, 0x00, 75 ])
if ans[0] != 0x10:
raise IOError("Wrong answer id")
if len(ans) != 7:
raise IOError("Wrong answer length")
if int.from_bytes(ans[1:3], byteorder="big") != 75:
raise IOError("Wrong var id")
value = int.from_bytes(ans[3:8], byteorder="big")
return "{}°C".format(value / 10)
#Vom Regler berechnete Vorlaufsolltemperatur Heizkreis 2 (Fußbodenheizung)
def vorlauf_HK2_soll(serial):
ans = call_command(serial, [ 0x10, 0x00, 92 ])
if ans[0] != 0x10:
raise IOError("Wrong answer id")
if len(ans) != 7:
raise IOError("Wrong answer length")
if int.from_bytes(ans[1:3], byteorder="big") != 92:
raise IOError("Wrong var id")
value = int.from_bytes(ans[3:8], byteorder="big")
return "{}°C".format(value / 10)
#Vom Regler berechnete Speichersolltemperatur
def speicher_soll(serial):
ans = call_command(serial, [ 0x10, 0x00, 116 ])
if ans[0] != 0x10:
raise IOError("Wrong answer id")
if len(ans) != 7:
raise IOError("Wrong answer length")
if int.from_bytes(ans[1:3], byteorder="big") != 116:
raise IOError("Wrong var id")
value = int.from_bytes(ans[3:8], byteorder="big")
return "{}°C".format(value / 10)
#wird zum Vergleich Speicher Soll/Ist Temperatur benutzt
def speicher_oben_ist(serial):
ans = call_command(serial, [ 0x10, 0x00, 7 ])
if ans[0] != 0x10:
raise IOError("Wrong answer id")
if len(ans) != 7:
raise IOError("Wrong answer length")
if int.from_bytes(ans[1:3], byteorder="big") != 7:
raise IOError("Wrong var id")
value = int.from_bytes(ans[3:8], byteorder="big")
return "{}°C".format(value / 10)
#gesammt Energieertrag der Solaranlage seit IBN
def energieertrag_solar(serial):
ans = call_command(serial, [ 0x10, 0x00, 36 ])
if ans[0] != 0x10:
raise IOError("Wrong answer id")
if len(ans) != 7:
raise IOError("Wrong answer length")
if int.from_bytes(ans[1:3], byteorder="big") != 36:
raise IOError("Wrong var id")
value = int.from_bytes(ans[3:8], byteorder="big")
return "{} MWh".format(round(value / 1000000, 1))
#Tagesertrag der Solaranlage
def tagesertrag_solar(serial):
ans = call_command(serial, [ 0x10, 0x00, 37 ])
if ans[0] != 0x10:
raise IOError("Wrong answer id")
if len(ans) != 7:
raise IOError("Wrong answer length")
if int.from_bytes(ans[1:3], byteorder="big") != 37:
raise IOError("Wrong var id")
value = int.from_bytes(ans[3:8], byteorder="big")
return "{} KWh".format(value / 10)
#Versuch Abfrage der Bitvariablen
def abfrage_bitv(serial):
ans = call_command(serial, [ 0x20 ])
if ans[0] != 0x20:
raise IOError("Wrong answer id")
return int.from_bytes(ans[1:3], byteorder="big")#hier habe gerade Keine wie ich die Info vom Regel sinnvoll auswerte
def main():
ser = serial.Serial("/dev/ttyUSB0",
19200,
xonxoff=False,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=2)
ser.rts = 0
# for i in range(3):
while True:
now = datetime.datetime.now()
print(now.strftime('%d.%m.%Y'))
print(now.strftime('%H:%M:%S'))
print("prosolar PS600"), print("Kennung:", reglerkennung(ser))
print("Versionsnummer:", versionsnummer(ser))
print("")
print("Istwerte")
for fuehler, name in TEMPERATURFUEHLER.items():
print("{}: {}".format(name, temperaturfuehler(ser, fuehler)))
print("")
print("Erträge")
print("Energieertrag Solar:", energieertrag_solar(ser))
print("Tagesertrag Solar:" , tagesertrag_solar(ser))
print("")
print("Abfrage Bitvariante:" , abfrage_bitv(ser))
print("")
print("Sollwerte")
print("Vorlauf Soll HK1:", vorlauf_HK1_soll(ser)) ; print("Vorlauf Soll HK2:", vorlauf_HK2_soll(ser))
print("Speicher Soll:", speicher_soll(ser))
#Überprüfung ob Speicheristtemperatur über Speichersolltemperatur liegt
#sollte das nicht zutreffen, soll hier (wenn ich wies wie) eine Benachrichtigung zu auf Smartphone erfolgen
if (speicher_oben_ist(ser)) < (speicher_soll(ser)):
print("Temp. Warnung")
else:
print("Temp.ok")
#Versuch Daten aus anderem Modul zu verwenden
sollwerte.sollwert_test()
print("")
print("")
time.sleep(10)#zu Testzwecken auf 10 Sekunden
if __name__ == '__main__':
main()