evn_smartmeter/evn_smartmeter_kaifa.py

161 lines
4.5 KiB
Python
Raw Permalink Normal View History

2026-03-29 08:27:15 +02:00
#!/usr/bin/python
import sys, string, time, serial
from gurux_dlms.GXByteBuffer import GXByteBuffer
from gurux_dlms.GXDLMSTranslator import GXDLMSTranslator
from gurux_dlms.GXDLMSTranslatorMessage import GXDLMSTranslatorMessage
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from binascii import unhexlify
import paho.mqtt.client as mqtt
from bs4 import BeautifulSoup
# EVN Schlüssel
evn_schluessel = "B294F5695DC03D82E1A34D368432BDFC"
# MQTT verwenden (True | False)
useMQTT = True
# MQTT Broker
#mqttBroker = 'localhost'
#mqttPort = 1883
mqttBroker = '192.168.0.11'
mqttPort = 1883
mqttuser = 'smartmeter-neues-haus'
mqttpasswort = '07ZzHFfwE0lac3pUUc1z'
# Aktuelle Werte auf Console ausgeben (True | False)
printValue = False
# COM Port
comport = '/dev/ttyUSB0'
# MQTT init
def on_connect(client, userdata, flags, rc):
if rc != 0:
print("Connection to MQTT broker failed with rc = ", rc)
if useMQTT:
try:
client = mqtt.Client("smartmeter-neues-haus")
client.username_pw_set(mqttuser, mqttpasswort)
client.on_connect = on_connect
client.connect(mqttBroker, port=mqttPort)
client.loop_start()
except:
print("Connection to MQTT broker failed")
sys.exit()
tr = GXDLMSTranslator()
tr.blockCipherKey = GXByteBuffer(evn_schluessel)
tr.comments = True
ser = serial.Serial(
port=comport,
baudrate=2400,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
)
while 1:
daten = ser.read(size=282).hex()
# print('\nRohdaten: \n\n' + daten)
msg = GXDLMSTranslatorMessage()
msg.message = GXByteBuffer(daten)
xml = ""
pdu = GXByteBuffer()
tr.completePdu = True
while tr.findNextFrame(msg, pdu):
pdu.clear()
xml += tr.messageToXml(msg)
# print('\nXML entschlüsselt: \n\n' + xml)
soup = BeautifulSoup(xml, 'lxml')
results_32 = soup.find_all('uint32')
results_16 = soup.find_all('uint16')
# Wirkenergie A+ in KiloWattstunden
WirkenergieP = int(str(results_32)[16:16+8],16)/1000
# Wirkenergie A- in KiloWattstunden
WirkenergieN = int(str(results_32)[52:52+8],16)/1000
# Momentanleistung P+ in Watt
MomentanleistungP = int(str(results_32)[88:88+8],16)
# Momentanleistung P- in Watt
MomentanleistungN = int(str(results_32)[124:124+8],16)
# Spannung L1 in Volt
SpannungL1 = int(str(results_16)[16:20],16)/10
# Spannung L2 in Volt
SpannungL2 = int(str(results_16)[48:52],16)/10
# Spannung L3 in Volt
SpannungL3 = int(str(results_16)[80:84],16)/10
# Strom L1 in Ampere
StromL1 = int(str(results_16)[112:116],16)/100
# Strom L2 in Ampere
StromL2 = int(str(results_16)[144:148],16)/100
# Strom L3 in Ampere
StromL3 = int(str(results_16)[176:180],16)/100
# Leistungsfaktor
Leistungsfaktor = int(str(results_16)[208:212],16)/1000
# Shell
if printValue:
print('Wirkenergie+: ' + str(WirkenergieP))
print('Wirkenergie-: ' + str(WirkenergieN))
print('MomentanleistungP+: ' + str(MomentanleistungP))
print('MomentanleistungP-: ' + str(MomentanleistungN))
print('Spannung L1: ' + str(SpannungL1))
print('Spannung L2: ' + str(SpannungL2))
print('Spannung L3: ' + str(SpannungL3))
print('Strom L1: ' + str(StromL1))
print('Strom L2: ' + str(StromL2))
print('Strom L3: ' + str(StromL3))
print('Leistungsfaktor: ' + str(Leistungsfaktor))
print('Momentanleistung: ' + str(MomentanleistungP-MomentanleistungN))
print()
print()
# MQTT
if useMQTT:
client.publish("neues-haus/smartmeter/WirkenergieP", WirkenergieP)
client.publish("neues-haus/smartmeter/WirkenergieN", WirkenergieN)
client.publish("neues-haus/smartmeter/MomentanleistungP", MomentanleistungP)
client.publish("neues-haus/smartmeter/MomentanleistungN", MomentanleistungN)
client.publish("neues-haus/smartmeter/Momentanleistung", MomentanleistungP - MomentanleistungN)
client.publish("neues-haus/smartmeter/SpannungL1", SpannungL1)
client.publish("neues-haus/smartmeter/SpannungL2", SpannungL2)
client.publish("neues-haus/smartmeter/SpannungL3", SpannungL3)
client.publish("neues-haus/smartmeter/StromL1", StromL1)
client.publish("neues-haus/smartmeter/StromL2", StromL2)
client.publish("neues-haus/smartmeter/StromL3", StromL3)
client.publish("neues-haus/smartmeter/Leistungsfaktor", Leistungsfaktor)
#except BaseException as err:
# print("Fehler: ", format(err))
# sys.exit()