Mqtt Daten werden nicht geschrieben -> SmartMeter

Gexle

New member
Hallo

Bin neu hier und habe gesehen hier gibt es Mqtt Profis...

Ich habedas ganze installiert und mein SmartMeter auszulesen Daten bekomme ich auch aber wenn ich MQTT aktiviere kommt diese Fehlermeldung.

Habe diese Software dazu installiert...

  • Node Red (v2.2.0)
  • InfluxDB (v1.8.10)
  • Mosquito MQTT Broker (v1.5.7)
Wie laut Anleitung habe ich Nodered InfluxDB und alles installiert und das hat auch alles soweit geklappt Database SmartMeter wird auch gefunden.

Wenn ich jetzt im Script das ganze auf True stelle und eben die IP den RPI eingebe und das Port 1883 und das Script starte bekomme ich diese Meldung..

(pythonvenv) pi@SmartMeterKaifa:~ $ python3 /home/pi/Desktop/SmartmeterTiNetz.py
Die Ip Adresse des Brokers ist falsch!
Traceback (most recent call last):
File "/home/pi/Desktop/SmartmeterTiNetz.py", line 43, in <module>
client = mqtt.Client("SmartMeter")
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pi/pythonvenv/lib/python3.11/site-packages/paho/mqtt/client.py", line 772, in __init__
raise ValueError(
ValueError: Unsupported callback API version: version 2.0 added a callback_api_version, see docs/migrations.rst for details

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/pi/Desktop/SmartmeterTiNetz.py", line 48, in <module>
sys.exit()
^^^
NameError: name 'sys' is not defined
(pythonvenv) pi@SmartMeterKaifa:~ $


Sowie das ausschaut muss ich den Paho Python MQTT von V2.1.0 auf V2.0 downgraden...
 
Zuletzt bearbeitet:
Hier wäre das Script dazu welche ich verkleinert haben 10000 Zeichen aber man sieht ja alles..

Ip und Port ist hinterlegt und Broker läuft...

Es scheint was mit dem Paho Python MQTT zutun habe habe die V2.1.0

Sowie das ausschaut muss ich den Paho Python MQTT von V2.1.0 auf V2.0 downgraden...

Keine Ahnung wie ich das machen soll...


Code:
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: paho-mqtt in ./pythonvenv/lib/python3.11/site-packages (2.1.0)
(pythonvenv) pi@SmartMeterKaifa:~ $

Code:
from os import system, name
import time
from time import sleep
import binascii
import datetime
import serial
#from Crypto.Cipher import AES
from Cryptodome.Cipher import AES
import paho.mqtt.client as mqtt
import os

# Environment Variable setzen, damit der Fehler nicht auf der Console Kommt
os.environ['TERM'] = 'xterm'

#Aktuelle Werte auf Console ausgeben (True | False)
printValue = True

#MQTT Verwenden (True | False)
useMQTT = True
#MQTT Broker IP adresse Eingeben ohne Port!
mqttBroker = "10.0.0.226"
mqttuser = ""
mqttpasswort = ""
mqttport = 1883

#Comport Config/Init
comport = "/dev/ttyUSB0"

# EVN Schlüssel eingeben zB. “36C66639E48A8CA4D6BC8B282A793BBB”
key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
key=binascii.unhexlify(key)

def clear():
    if name == 'nt':
        _ = system('cls')
 
    else:
        _ = system('clear')

#MQTT Init
if useMQTT:
    try:
        client = mqtt.Client("SmartMeter")
        client.username_pw_set(mqttuser, mqttpasswort)
        client.connect(mqttBroker, mqttport)
    except:
        print("Die Ip Adresse des Brokers ist falsch!")
        sys.exit()

ser = serial.Serial( port=comport,
        baudrate=2400,
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_NONE,
)

def recv(serial):
    while True:
        data = serial.read_all()
        if data == '':
            print ("\n...")
            continue
        else:
            #print ("\n...lausche auf Schnittstelle")
            break
        sleep(6)
    return data

 
# hier wurde die serielle Schnittstelle vom Raspberry verwendet
if __name__ == '__main__':
    serial = serial.Serial(
     port=comport,
     baudrate = 2400,
     parity=serial.PARITY_EVEN,
     stopbits=serial.STOPBITS_ONE,
     bytesize=serial.EIGHTBITS
    )
 
Zuletzt bearbeitet von einem Moderator:
Hi,

auch wenn ich von der Sache an sich keine Ahnung habe...
Wenn ich jetzt im Script das ganze auf True stelle und eben die IP den RPI eingebe und das Port 1883 und das Script starte bekomme ich diese Meldung..
... hast Du denn mal geschaut, ob der RPI auch auf Port 1883 reagiert? Mal schauen, ob der Port offen ist (mittels Portscanner, z.B. nmap), oder via mqtt-explorer.
 
Jetzt habe ich ein downgrade gemacht auf die V1.6.1

Code:
(pythonvenv) pi@SmartMeterKaifa:~ $ pip3 install "paho-mqtt<2.0.0"
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: paho-mqtt<2.0.0 in ./pythonvenv/lib/python3.11/site-packages (1.6.1)
(pythonvenv) pi@SmartMeterKaifa:~ $

Habe wieder mqtt aktiviert jetzt kommt das.

pythonvenv) pi@SmartMeterKaifa:~ $ python3 /home/pi/Desktop/SmartmeterTiNetz.py
Die Ip Adresse des Brokers ist falsch!
Traceback (most recent call last):
File "/home/pi/Desktop/SmartmeterTiNetz.py", line 45, in <module>
client.connect(mqttBroker, mqttport)
File "/home/pi/pythonvenv/lib/python3.11/site-packages/paho/mqtt/client.py", line 914, in connect
return self.reconnect()
^^^^^^^^^^^^^^^^
File "/home/pi/pythonvenv/lib/python3.11/site-packages/paho/mqtt/client.py", line 1044, in reconnect
sock = self._create_socket_connection()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pi/pythonvenv/lib/python3.11/site-packages/paho/mqtt/client.py", line 3685, in _create_socket_connection
return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/socket.py", line 851, in create_connection
raise exceptions[0]
File "/usr/lib/python3.11/socket.py", line 836, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/pi/Desktop/SmartmeterTiNetz.py", line 48, in <module>
sys.exit()
^^^
NameError: name 'sys' is not defined
(pythonvenv) pi@SmartMeterKaifa:~ $




 
Habe jetzt mal bei IP 127.0.0.1 localhost eingeben jetzt kahm keine Fehlermeldung mehr Daten werden abgerufen...aber Daten sehe ich tortzdem keine bei Nodered..

Code:
from os import system, name
import time
from time import sleep
import binascii
import datetime
import serial
#from Crypto.Cipher import AES
from Cryptodome.Cipher import AES
import paho.mqtt.client as mqtt
import os

# Environment Variable setzen, damit der Fehler nicht auf der Console Kommt
os.environ['TERM'] = 'xterm'

#Aktuelle Werte auf Console ausgeben (True | False)
printValue = True

#MQTT Verwenden (True | False)
useMQTT = True
#MQTT Broker IP adresse Eingeben ohne Port!
mqttBroker = "127.0.0.1"
mqttuser = ""
mqttpasswort = ""
mqttport = 1883

#Comport Config/Init
comport = "/dev/ttyUSB0"

# EVN Schlüssel eingeben zB. “36C66639E48A8CA4D6BC8B282A793BBB”
key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
key=binascii.unhexlify(key)

def clear():
    if name == 'nt':
        _ = system('cls')
 
    else:
        _ = system('clear')

#MQTT Init
if useMQTT:
    try:
        client = mqtt.Client("SmartMeter")
        client.username_pw_set(mqttuser, mqttpasswort)
        client.connect(mqttBroker, mqttport)
    except:
        print("Die Ip Adresse des Brokers ist falsch!")
        sys.exit()

ser = serial.Serial( port=comport,
        baudrate=2400,
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_NONE,
)

def recv(serial):
    while True:
        data = serial.read_all()
        if data == '':
            print ("\n...")
            continue
        else:
            #print ("\n...lausche auf Schnittstelle")
            break
        sleep(6)
    return data

   
# hier wurde die serielle Schnittstelle vom Raspberry verwendet
if __name__ == '__main__':
    serial = serial.Serial(
     port=comport,
     baudrate = 2400,
     parity=serial.PARITY_EVEN,
     stopbits=serial.STOPBITS_ONE,
     bytesize=serial.EIGHTBITS
    )

    headerstart = "68fafa68"

    while True:

        sleep(5)
 
        data = recv(serial)
        doit = 0
        if (data != b'') & (len(data) >= 355):
            startbytes = data[0:4].hex()
            #print ("startbytes = ", startbytes)
            #print ("headerstart = ", headerstart)
            if (startbytes == headerstart):
                #print ("\nstartbytes und headerstart sind gleich\n")
                doit = 1
                #print ("Laenge von data = ", len(data))
 
Hier mal das Nodered Projekt vielleicht kann sich das mal einer anschauen bitte.

Es werden alle Daten ausgelesen siehe Bild..

1734634424749.png

Aber in Nodered kann ich nur die 3 Spannungen und Strom auslesen btw. debugen der Rest geht nicht keine Ahnung

Danke euch
 

Anhänge

  • flows-1-1.txt
    24,7 KB · Aufrufe: 4
Die Daten werden ausgelesen von Zähler über das Script ja aber in Nodered werden nur Spannung L1-L3 und Strom L1-L3 erkannt bzw. kann man sich mit dem Debug Baustein anzeigen lassen.

zbs. Wirkleistung Positiv oder Wirkleistung Negativ oder all die anderen Werte werden nicht angezeigt in Notered aber über das Script ausgelesen/angezeigt siehe Bild oben das ist das komische daran.



Aber ich kenn mich mit dem Script nicht aus ob es daran liegt oder wo auch immer...
 
Zuletzt bearbeitet:

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
5.880
Beiträge
57.453
Mitglieder
5.813
Neuestes Mitglied
Blacksnofru
Zurück
Oben