über einen USB zu MBUS - umsetzer lese ich einen Stomzähler wie folgt aus:
Code: Alles auswählen
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import time, sys
import os
import serial
import mysql.connector as mariadb
imp = 0
Empfang = []
ser = serial.Serial('/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0', 2400, 8, 'E', 1, 5.0)
try:
vgl_Sek = 0
vgl_Min = 0
stop = 0
while True :
Sek = int(time.strftime('%S'))
Min = int(time.strftime('%M'))
Std = int(time.strftime('%M'))
Tag = int(time.strftime('%d'))
Mon = int(time.strftime('%m'))
Jahr = int(time.strftime('%Y'))
localtime = time.localtime(time.time())
if Sek != 10 and Sek != 30 and Sek != 50 and imp ==1:
imp = 0
if ((Sek == 10 or Sek == 30 or Sek == 50) and imp == 0):
imp = 1
ser.write(bytearray([0x10, 0x7B, 0x01, 0x7C, 0x16]))
Wirkarbeit = 0.0
Akt_P_L1 = 0.0
U_L1 = 0.0
U_L2 = 0.0
U_L3 = 0.0
i = 0
Empfang.clear()
gelesen = 0
while (i<253):#253
Empfangsfach = ser.read()
if Empfangsfach:
Empfang.append(format(ord(Empfangsfach)))
i = i+1
gelesen = 1
#else:
if gelesen == 0:
print("Gelesen = " + str(gelesen))
print("i = " + str(i))
if gelesen == 1 and i >= 252:
ii = 0
while (ii < (i - 9)):
#Wirkarbeit einlesen
if Empfang[ii] == '132' and Empfang[ii+1] == '16' and Empfang[ii+2] == '131':#0x84, 0x10, 0x83
#print(Empfang[ii], Empfang[ii+1], Empfang[ii+2] )
Wirkarbeit = ((((((int(Empfang[ii+7]) * 256) + int(Empfang[ii+6])) * 256) +
int(Empfang[ii+5])) * 256) + int(Empfang[ii+4]))/1000
#erg = int(Empfang[ii+6])*256
print(Wirkarbeit)
#Altuelle Wirkleistung auslesen
if Empfang[ii] == '4' and Empfang[ii+1] == '171' and Empfang[ii+2] == '255' and Empfang[ii+3] == '129':#0x04, 0xAB, 0xFF, 0x81
#print(Empfang[ii], Empfang[ii+1], Empfang[ii+2] )
Akt_P_L1 = ((((((int(Empfang[ii+8]) * 256) + int(Empfang[ii+7])) * 256) +
int(Empfang[ii+6])) * 256) + int(Empfang[ii+5]))/1000
#erg = int(Empfang[ii+6])*256
print(Akt_P_L1)
#U_L1
if Empfang[ii] == '2' and Empfang[ii+1] == '253' and Empfang[ii+2] == '201' and Empfang[ii+3] == '255' and Empfang[ii+4] == '129':#0x02, 0xFD, 0xC9, 0xFF, 0x81
#print(Empfang[ii], Empfang[ii+1], Empfang[ii+2] )
U_L1 = (int(Empfang[ii+7]) * 256) + int(Empfang[ii+6])
#erg = int(Empfang[ii+6])*256
print(U_L1)
#U_L2
if Empfang[ii] == '2' and Empfang[ii+1] == '253' and Empfang[ii+2] == '201' and Empfang[ii+3] == '255' and Empfang[ii+4] == '130':#0x02, 0xFD, 0xC9, 0xFF, 0x82
#print(Empfang[ii], Empfang[ii+1], Empfang[ii+2] )
U_L2 = (int(Empfang[ii+7]) * 256) + int(Empfang[ii+6])
#erg = int(Empfang[ii+6])*256
print(U_L2)
#U_L3
if Empfang[ii] == '2' and Empfang[ii+1] == '253' and Empfang[ii+2] == '201' and Empfang[ii+3] == '255' and Empfang[ii+4] == '131':#0x02, 0xFD, 0xC9, 0xFF, 0x83
#print(Empfang[ii], Empfang[ii+1], Empfang[ii+2] )
U_L3 = (int(Empfang[ii+7]) * 256) + int(Empfang[ii+6])
#erg = int(Empfang[ii+6])*256
print(U_L3)
break
ii = ii+1
#print(erg)
#a = hex(ord(Empfang[44]))
#ser.close()
if Sek == 0 and vgl_Min != Min and i >= 252:
add_zaehler(localtime, Wirkarbeit)
vgl_Min = Min
except KeyboardInterrupt:
# Programm wird beendet wenn CTRL+C gedrückt wird.
print('Temperaturmessung wird beendet')
except Exception as e:
print(str(e))
sys.exit(1)
finally:
# Das Programm wird hier beendet, sodass kein Fehler in die Console geschrieben wird.
print('Programm wird beendet.')
print("i = " + str(i) + " ii = " + str(ii))
print(localtime)
sys.exit(0)
Das Programm funktioniert soweit. Nach einiger Zeit (mehrere Stunden) jedoch werden keine Werte mehr vom Zähler eingelesen.
Anhand des Flackerns der LED auf dem MBUS - Umsetzer sieht man, dass das Sendetelegramm abgeschickt wird und der Zähler auch antwortet. Die Variable "Empfangsfach" ist jedoch leer.
Auch ein Neustart des Programms hilft nichts, erst, wenn der Umsetzer einmal vom UDB getrennt wurde, läuft die Kommunikation wieder.
Hat jemand eine Idee, woran das liegt?