habe gerade erst vor ein paar Tagen mit Python und MQTT usw. angefangen, daher bitte nicht gleich motzen wenn es eine dumme Frage ist.
Ich versuche gerade eine Steuerung des Ladestroms meiner Wallbox entsprechend der vorhandenen PV Überschussleistung am Zählerpunkt zu erstellen.
Dabei wird der Wechselrichter bzw. das Smart Energy Meter über PyModbus ausgelesen und der Ladestrom entsprechend eine möglich 1phasigen oder 3phasigen (>4300W) Ladung berechnet. Das funktioniert soweit.
Da ich aber noch ein paar error cases abfragen möchte (-> Schütz für 1ph->3ph klebt (Kontrollschleife -> am Raspi GPIO #24), Ladezustand an der Wallbox (=Auto lädt gerade), Wallbox Fehler Status) muss ich dazu per MQTT die Wallbox Informationen auslesen und im Programm zur Entscheidung was als nächstes getan werden muss heranziehen.
Aber das kriege es einfach nicht hin

Die global Variablen werden egal was ich probiere im Main Programm nicht erkannt.
Ich habe auch eine Version mit einem client = mqtt().Client() usw. probiert (also ohne client_error, client_vehicle) ging auch nicht.
Es scheint ich bekomme den jeweiligen msg.payload nicht in den Main code um die If Funktion durchzuführen.
Muss ich ev. die mehr oder wenige While -Schleife in den def on_message reinnehmen?
Aber dann kann ich doch nicht parallel den Payload des anderen topics lesen und verarbeiten?!
Wäre klasse wenn mir hier jemand sagen könnte wo das Problem liegt bzw. wie man das beheben könnte
Markus
Die entsprechenden Codebereiche:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Modbus Read & MQTT communication & GPIO actions
import math
import pymodbus
from pymodbus.client.sync import ModbusTcpClient
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
import paho.mqtt.client as mqtt
import paho.mqtt.subscribe as subscribe
import RPi.GPIO as GPIO
import time
# Define if GPIO is addressed by Boardnumer 1-40 or like here as GPIO ID
GPIO.setmode(GPIO.BCM)
# Define GPIO 23 as output
# Define GPIO 24 as input (from Schuetzloop - closed)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.IN)
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("warp/ABC/evse/state/error_state")
client.subscribe("warp/ABC/evse/state/vehicle_state")
# The callback for when a PUBLISH message is received from the server
def on_message(client, userdata, msg):
print(" Start on_message ")
print(msg.topic+" : " + msg.payload)
if msg.topic == "warp/ABC/evse/state/error_state" :
global WB_error_state
WB_error_state = msg.payload.decode("utf-8")
if msg.topic == "warp/ABC/evse/state/vehicle_state" :
global vehicle_state
vehicle_state = msg.payload.decode("utf-8")
# Code für Def relevante Modbus Register, Data read out, Formatierung
# ...
#
if __name__ == "__main__":
WB_error_state = 0
vehicle_state = 2
client_error = mqtt.Client()
client_error.connect("192.xxx.yyy.zzz", 1883, 60)
client_error.on_connect = on_connect
client_error.on_message = on_message
client_vehicle = mqtt.Client()
client_vehicle.connect("192.xxx.yyy.zzz", 1883, 60)
client_vehicle.on_connect = on_connect
client_vehicle.on_message = on_message
while WB_error_state == 0:
print("Starting Query.....")
# Code für Modbus Aktionen -> PV Leistung, Überschussberechnung und Berechnung curr_1ph, curr_3p
# ...
#
client_error.subscribe("warp/ABC/evse/state/error_state")
if msg.topic == "warp/ABC/evse/state/error_state" :
WB_error_state = msg.payload.decode("utf-8")
client_vehicle.subscribe("warp/ABC/evse/state/vehicle_state")
if msg.topic == "warp/ABC/evse/state/vehicle_state" :
vehicle_state = msg.payload.decode("utf-8")
# Routine für Umschalten Ladestrom und 3ph
if WB_error_state == 0 and vehicle_state == 2 :
client.publish("warp/ABC/evse/stop_charging","", 2)
time.sleep(2)
GPIO.output(23, GPIO.LOW)
if GPIO.input(24): # If all is okay GPIO 24 signal = high
client.publish("warp/ABC/evse/current_limit", curr_3p, 2)
time.sleep(2)
client.publish("warp/ABC/evse/start_charging","", 2)
elif vehicle_state == 3:
client.publish("warp/ABC/evse/current_limit", 0, 2)
client.publish("warp/ABC/evse/stop_charging", "", 2)
time.sleep(2)
else :
client.publish("warp/ABC/evse/current_limit", curr_1p, 2)
client.loop_forever()
print("End")
GPIO.cleanup()