NEWS
[Gelöst] Protokoll connection closed: Error: read ECONNRESET
-
Systemdata Bitte Ausfüllen Hardwaresystem: Pi4 Arbeitsspeicher: 4GB Festplattenart: micro SD Betriebssystem: Raspberry Pi OS Node-Version: 10.x.x Nodejs-Version: 18.16.1 NPM-Version: 9.5.1 Installationsart: Skript Image genutzt: Ort/Name der Imagedatei: --- Hallo,
ist wahrscheinlich nur eine Kleinlichkeit aber ich würde gerne mein System sauber haben.
Ich habe mir vor mehreren Monaten ein Script auf einen Raspberry Zero W zum Smart Meter auslesen eingerichtet.
Von diesem werden die Daten per MQTT an meinen ioBroker gesendet/geholt.Zum Problem:
Es kommen Sekündlich immer diese Einträge im Protokoll. Muss ich hier noch etwas beim MQTT Adapter umstellen?2023-07-13 12:25:30.956 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243930956_9859 2023-07-13 12:25:35.829 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:25:35.836 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243935835_7864 2023-07-13 12:25:40.847 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:25:40.853 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243940852_5599 2023-07-13 12:25:45.902 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:25:45.908 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243945907_1062 2023-07-13 12:25:50.844 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:25:50.850 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243950849_2809 2023-07-13 12:25:55.878 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:25:55.884 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243955883_6450 2023-07-13 12:26:00.872 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:26:00.878 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243960877_1310 2023-07-13 12:26:05.819 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:26:05.829 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243965828_3859 2023-07-13 12:26:10.861 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:26:10.867 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243970866_5753 2023-07-13 12:26:15.873 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:26:15.879 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243975878_7525 2023-07-13 12:26:20.831 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:26:20.838 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243980837_9664 2023-07-13 12:26:25.838 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:26:25.845 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243985843_9629 2023-07-13 12:26:30.946 - info: mqtt.0 (1127) Client [SmartMeter] connection closed: Error: read ECONNRESET 2023-07-13 12:26:30.972 - info: mqtt.0 (1127) Client [SmartMeter] connected with secret 1689243990972_1685
Danke!
fg Thomas
-
Hier noch das Skript, dass auf dem Raspberry Pi Zero W (der direkt per Kabel mit dem Smartmeter verbunden ist) ausgeführt wird.
from gurux_dlms.GXByteBuffer import GXByteBuffer import serial import time from cryptography.hazmat.primitives.ciphers.aead import AESGCM from binascii import unhexlify import sys import string import paho.mqtt.client as mqtt from gurux_dlms.GXDLMSTranslator import GXDLMSTranslator from gurux_dlms.GXDLMSTranslatorMessage import GXDLMSTranslatorMessage from bs4 import BeautifulSoup # EVN Schlüssel eingeben zB. "36C66639E48A8CA4D6BC8B282A793BBB" evn_schluessel = "meinEVNKey" #MQTT Verwenden (True | False) useMQTT = True #MQTT Broker IP adresse Eingeben ohne Port! mqttBroker = "192.168.178.100" mqttuser ="Tom" mqttpasswort = "meinPasswort" #Aktuelle Werte auf Console ausgeben (True | False) printValue = False #Comport Config/Init comport = "/dev/ttyUSB0" #MQTT Init if useMQTT: try: client = mqtt.Client("SmartMeter") client.username_pw_set(mqttuser, mqttpasswort) client.connect(mqttBroker, port=1883) except: print("Die Ip Adresse des Brokers ist falsch!") 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(daten) msg = GXDLMSTranslatorMessage() msg.message = GXByteBuffer(daten) xml = "" pdu = GXByteBuffer() tr.completePdu = True while tr.findNextFrame(msg, pdu): pdu.clear() xml += tr.messageToXml(msg) soup = BeautifulSoup(xml, 'lxml') results_32 = soup.find_all('uint32') results_16 = soup.find_all('uint16') #print(results_16) #Wirkenergie A+ in Wattstunden WirkenergieP = int(str(results_32)[16:16+8],16) #Wirkenergie A- in Wattstunden WirkenergieN = int(str(results_32)[52:52+8],16) #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 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: connected = False while not connected: try: client.reconnect() connected = True except: print("Lost Connection to MQTT...Trying to reconnect in 2 Seconds") time.sleep(2) client.publish("Smartmeter/WirkenergieP", WirkenergieP) client.publish("Smartmeter/WirkenergieN", WirkenergieN) client.publish("Smartmeter/MomentanleistungP", MomentanleistungP) client.publish("Smartmeter/MomentanleistungN", MomentanleistungN) client.publish("Smartmeter/Momentanleistung", MomentanleistungP - MomentanleistungN) client.publish("Smartmeter/SpannungL1", SpannungL1) client.publish("Smartmeter/SpannungL2", SpannungL2) client.publish("Smartmeter/SpannungL3", SpannungL3) client.publish("Smartmeter/StromL1", StromL1) client.publish("Smartmeter/StromL2", StromL2) client.publish("Smartmeter/StromL3", StromL3) client.publish("Smartmeter/Leistungsfaktor", Leistungsfaktor) #except BaseException as err: # print("Fehler beim Synchronisieren. Programm bitte ein weiteres mal Starten.") # print() # print("Fehler: ", format(err)) # sys.exit()
Mit diesem Skript werden Informationen vom SmartMeter abgegriffen/übermittelt und
per MQTT an meinen ioBroker (auf einen anderen Raspberry Pi 4) gesendet!
Vielleicht hilft das weiter? -
Hat keiner eine Idee oder ist dies so ein Spezialfall?
-
CONNRESET ist üblicherweise Netzwerktrouble. Die Kiste kann nicht erreicht werden.
-
Könnte es auch sein, dass das durch das von mir angehängte Skript "verursacht" wird. Sozusagen die Message vom Smartmeter habe ich bekommen und jetzt beende ich die Verbindung!?
Ich bin kein Python Profi aber mir wäre in dem Skript nichts aufgefallen was auf eine einprogrammierte Beendigung hindeutet
Hättest du eine Idee wo ich die Fehlersuche fortsetzen sollte?
-
@tomcomm27
Guten Morgen, gibt es hier keine weiteren Ideen wie ich diese unnötigen MQTT Nachrichten weg bekomme? -
@tomcomm27 sagte in Protokoll connection closed: Error: read ECONNRESET
gibt es hier keine weiteren Ideen wie ich diese unnötigen MQTT Nachrichten weg bekomme?
Die Meldungen kommen daher (wie du schon richtig vermutet hast), dass dein Skript nach jedem Senden die Verbindung hart beendet. Aber es sind nur „Info“ Meldungen. Wenn du das Loglevel auf mindestens „warn“ herunterschraubst, erscheinen die Meldungen nicht mehr im Log.
Edit: Alternativ könntest du ja zum Schluss ein „client.disconnect()“ absetzen, damit die Verbindung sauber beendet wird.
-
Hallo Marc,
danke für deinen Antwort! Ich habe von einer andere Seite den Tipp bekommen mit
client.loop_start()
oder
client.loop_forever()
statt dem gesamten Code:
connected = False while not connected: try: client.reconnect() connected = True except: print("Lost Connection to MQTT...Trying to reconnect in 2 Seconds") time.sleep(2)
zu verwenden. Dies hat zum Ziel geführt damit die Verbindung nicht immer abbricht und ich keine Hinweise mehr im Protokoll bekomme.
Diese zwei Möglichkeiten sollten auch einen automatischen Reconnect schaffen!fg Thomas