Nun habe ich es endlich geschafft: Alles läuft wie gedacht!
@Kelomat: Deinen Skript mit der MQTT-Anbindung habe ich problemlos zum laufen bekommen – aber wie Du selbst schriebst – nur mit einem Wert aus der Datenbank. Das Problem ist, wenn mehr als ein Wert abgerufen wird, werden die Daten der Reihe nach in die Variable msg geschrieben, so dass am Ende nur der letzte Wert in msg übrig bleibt.
Weil ich keine Lust hatte, noch was Neues (wie Node-RED) anzufangen, habe dann doch lieber die Datenfolgen in msg sequentiell heraus gespeichert: Zuerst mit einem Schieberegister (funktionierte, war aber aufwendiger), dann mit eine Art Flip-Flop (True/False, hat auch funktioniert, ist aber auf nur zwei Werte begrenzt) und letztlich mit einem Zähler. Das ist einfach und funktioniert auch für x-beliebig viele Werte. Weitere Infos stehen im Python-Skript:
Code: Alles auswählen
#!/usr/bin/env python3
"""
>>>>>>>> Solaranzeige-Surplus-RasPi-PWM.py <<<<<<<<<<<
------------------------------------------------------
Regelt bei ueberfluessiger PV-Leistung einen Verbraucher,
z.B.: den Heizstab eines Warmwasser-Boilers, ueber eine
PWM-Leistungsendstufe entsprechend hier definierten Bedingungen
bei ueberschuessiger PV-Leistung langsam in +10%-Schritten hoch
und wenn die Bedingungen nicht mehr erfuellt sind, in Schritten
deren Groesse das 2-fache des Batterieentladestromes (in % umgedeutet)
entspricht, mehr- oder weniger schnell wieder herunter.
Das PWM-Singnal wird am RasPi GPIO13 mit einer Frequenz von 20kHz
ausgegeben und ueber einen Opto-Koppler an die Leistungsendstufe
uebertragen. Achtung!
- Damit die erforderlichen Daten aus der Datenbank abgerufen werden
koennen: vorher 'pip install paho-mqtt' ausfuehren.
Bei Ausfuehrung in der root beim booten mit rc.local erfolgte aber
ImportError: No module named paho.mqtt.client
Dann einfach paho-mqtt nochmal in der root installieren.
- Damit der pigpio daemon fuer das Hardware-PWM Modul immer aktiv ist:
In Systemstart eintragen: 'sudo systemctl enable pigpiod'. """
import paho.mqtt.client as mqtt
import pigpio
import time
PIN = pigpio.pi()
PORT = 13 # PWM-Ausgang GPIO13
fqz = 20000 # PWM Frequenz = 20kHz
pwm = 500000 # PWM-Tastverhaeltnis 0...1000000 (500000 = 50%)
d = 0 # PWM-Tastverhaeltnis 0...100%
dch = 0 # Batterie 'discharge' (Entladestrom)
soc = 0 # Batterie 'state of charge' (Ladezustand)
n = 0 # Zaehler
# folgendes wird bei Abruf von 2 Variablen 2x durchlaufen:
def on_message(client, userdata, message):
msg = int(message.payload)
global n
global dch
global soc
global d
if n == 0 : soc = msg ; n += 1
else:
if n == 1 :
dch = msg
print ' Uhrzeit: ' , time.strftime("%H:%M", time.localtime())
print 'Batterieladezustand: ' , soc , '%'
print 'Batterieentladestrom: ' , dch , 'A'
#herunterregeln bei Batt.Entl.Strom >3A oder Batt.Ladezust. <95%:
if dch > 3 or soc < 95: d -= dch*2 # PWM-(dch*2) in % if = True
else: d += 10 # PWM+10% if = False
if d < 0 : d = 0
if d > 100 : d = 100
print 'PWM-Tastverhaeltnis: ', d , '%'
print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
pwm = d*10000
PIN.hardware_PWM(PORT, fqz, pwm) # start signal generation
n = 0
# Hier koennten noch Routinen fuer weitere Werte eingefuegt werden,
# angefangen mit if n == 2 : usw. In der letzten Routine muss am Ende
# wieder 'n = 0' wie hier stehen.
def on_connect(client, userdata, flags, rc):
# hier muessen die MQTT Nachrichten rein:
client.subscribe('solaranzeige/box1/batteriekapazitaet')
client.subscribe('solaranzeige/box1/batterieentladestrom')
Broker_address = "localhost"
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(Broker_address)
print ("Verbunden mit: "+ Broker_address)
print ("Warten auf den naechsten Scan...")
print ""
client.loop_forever()
Und hier ein Test, um zu sehen, wie die Regelung funktioniert. Da gerade keine Sonne scheint, und meine Batterie deshalb auch nicht voll ist, habe ich einfach mal den Grenzwert Batterie-SOC auf 50% gesetzt und streckenweise den Laststrom des WR abgeschaltet, damit er garantiert unter 3A ist:
Code: Alles auswählen
Verbunden mit: localhost
Warten auf den naechsten Scan...
Uhrzeit: 15:39
Batterieladezustand: 54 %
Batterieentladestrom: 3 A
PWM-Tastverhaeltnis: 10 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:40
Batterieladezustand: 54 %
Batterieentladestrom: 4 A
PWM-Tastverhaeltnis: 2 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:41
Batterieladezustand: 54 %
Batterieentladestrom: 5 A
PWM-Tastverhaeltnis: 0 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:42
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 10 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:43
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 20 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:44
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 30 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:45
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 40 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:46
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 50 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:47
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 60 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:48
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 70 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:49
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 80 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:50
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 90 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:51
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:52
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:53
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:54
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:55
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:56
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:57
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:58
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 15:59
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:00
Batterieladezustand: 53 %
Batterieentladestrom: 4 A
PWM-Tastverhaeltnis: 92 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:01
Batterieladezustand: 53 %
Batterieentladestrom: 5 A
PWM-Tastverhaeltnis: 82 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:02
Batterieladezustand: 53 %
Batterieentladestrom: 29 A
PWM-Tastverhaeltnis: 24 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:03
Batterieladezustand: 53 %
Batterieentladestrom: 26 A
PWM-Tastverhaeltnis: 0 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:04
Batterieladezustand: 53 %
Batterieentladestrom: 4 A
PWM-Tastverhaeltnis: 0 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:05
Batterieladezustand: 53 %
Batterieentladestrom: 6 A
PWM-Tastverhaeltnis: 0 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:06
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 10 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:07
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 20 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:08
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 30 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:09
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 40 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:10
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 50 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:11
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 60 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:12
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 70 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:13
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 80 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:14
Batterieladezustand: 53 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 90 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:15
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:16
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:17
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:18
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:19
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:20
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:21
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:22
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 100 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:23
Batterieladezustand: 52 %
Batterieentladestrom: 8 A
PWM-Tastverhaeltnis: 84 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:24
Batterieladezustand: 52 %
Batterieentladestrom: 52 A
PWM-Tastverhaeltnis: 0 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:25
Batterieladezustand: 52 %
Batterieentladestrom: 8 A
PWM-Tastverhaeltnis: 0 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:26
Batterieladezustand: 52 %
Batterieentladestrom: 8 A
PWM-Tastverhaeltnis: 0 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:27
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 10 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:28
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 20 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:29
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 30 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:30
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 40 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uhrzeit: 16:31
Batterieladezustand: 52 %
Batterieentladestrom: 0 A
PWM-Tastverhaeltnis: 50 %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Wie man sieht, passt sich die an den Überschuss-Verbraucher abgegebene Leistung durch die proportionale Regelung intelligent an die tatsächlich zur Verfügung stehende Leistung an. Damit werden dann auch kleine überschüssige Leistungen "abgezapft". Das ist sehr viel besser, als Verbraucher mit Relais voll-an / voll-ab zuschalten.
Das Skript läuft nun schon auf meinem RasPi automatisch im Hintergrund und wartet auf Sonne im Überfluss...
Den endgültigen Schaltplan für die PWM-Schaltstufe veröffentliche ich hier später, da ich noch etwas mit der Unterdrückung der EMI experimentieren muss.