Guten Abend,
vielen Dank an Dennis89 für diese ausführliche Antwort.
Ich wusste ja, dass ich am Anfang stehe aber durch deine Erläuterungen habe ich erkannt wie katastrophal das eigentlich ist.
Soweit ich konnte habe ich alles (was ich verstanden habe) in einem neuen Ansatz untergebracht.
Da es völlig anders aufgebaut ist wie das vorhergehende habe ich einen neuen Namen für die Datei vergeben.
import signal
import sys
import time
import socket
import struct
from configparser import ConfigParser
from speedwiredecoder import *
from RPi import GPIO
# GPIO.setwarnings(False)
PWM_PIN = 12
SCHEWLLE = 6850
STELLWERT = 0
UNTERER_STELLWERT = 0
OBERER_STELLWERT = 100
smaserials = "1901705467" # hier die eigene Seriennummer vom Homemanager eingeben!!!
IPBIND = '0.0.0.0'
MCAST_GRP = '239.12.255.254'
MCAST_PORT = 9522
def abort_program():
print('STRG + C = end program')
sys.exit(0)
# abort-signal
signal.signal(signal.SIGINT, abort_program)
def abrufen():
# Daten vom Home Manager erhalten
#read configuration
parser = ConfigParser()
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', MCAST_PORT))
try:
mreq = struct.pack("4s4s", socket.inet_aton(MCAST_GRP), socket.inet_aton(IPBIND))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
except BaseException:
print('could not connect to mulicast group or bind to given interface')
sys.exit(1)
emparts = {}
emparts = decode_speedwire(sock.recv(608))
print ('\n')
print ('SMA-EM Serial:{}'.format(emparts['serial']))
print ('----sum----')
print ('P: consume:{}W supply:{}W '.format(emparts['pconsume'],emparts['psupply']))
print ('----L1----')
print ('P: consume:{}W supply:{}W '.format(emparts['p1consume'],emparts['p1supply']))
print ('----L2----')
print ('P: consume:{}W supply:{}W'.format(emparts['p2consume'],emparts['p2supply']))
print ('----L3----')
print ('P: consume:{}W supply:{}W'.format(emparts['p3consume'],emparts['p3supply']))
return emparts
def regeln(emparts,pwm,STELLWERT): # Beginnen der Einspeisungsbezogenen Regelung
try:
Bezug_gesamt = emparts['pconsume']
Einspeisung_gesamt = emparts['psupply']
Überschuss = Einspeisung_gesamt - SCHEWLLE # alles was über den 70% ist
print ('')
print ('Bezug gesamt: ', Bezug_gesamt, 'Watt')
print ('Einspeisung gesamt: ', Einspeisung_gesamt, 'Watt')
print ('Leistung bezgl. Schwellwert:', round (Überschuss), 'Watt')
if Überschuss < 10000 and Überschuss > 1000: # Schleife greift wenn Überschuss zwischen 10000 und 500
STELLWERT = STELLWERT +10
if STELLWERT >= 100:
STELLWERT = OBERER_STELLWERT
print ('Regelschleife 1, Stellwert: ', STELLWERT, '%')
elif Überschuss < 1000 and Überschuss > 500: # Schleife greift wenn Überschuss zwischen 500 und 100
STELLWERT = STELLWERT +5
if STELLWERT >= 100:
STELLWERT = OBERER_STELLWERT
print ('Regelschleife 2, Stellwert: ', STELLWERT, '%')
elif Überschuss < 500 and Überschuss > 1: # Schleife greift wenn Überschuss zwischen 100 und 1
STELLWERT = STELLWERT +1
if STELLWERT >= 100:
STELLWERT = OBERER_STELLWERT
print ('Regelschleife 3, Stellwert: ', STELLWERT, '%')
elif Überschuss >= -10000 and Überschuss < -1000: # Schleife greift wenn Überschuss zwischen -10000 und -500
STELLWERT = STELLWERT -15
if STELLWERT <= 0:
STELLWERT = UNTERER_STELLWERT
print ('Regelschleife 4, Stellwert: ', STELLWERT, '%')
elif Überschuss > -1000 and Überschuss < -500: # Schleife greift wenn Überschuss zwischen -500 und -100
STELLWERT = STELLWERT -5
if STELLWERT <= 0:
STELLWERT = UNTERER_STELLWERT
print ('Regelschleife 5, Stellwert: ', STELLWERT, '%')
elif Überschuss > -500 and Überschuss < -1: # Schleife greift wenn Überschuss zwischen -100 und -1
STELLWERT = STELLWERT -2
if STELLWERT <= 0:
STELLWERT = UNTERER_STELLWERT
print ('Regelschleife 6, Stellwert: ', STELLWERT, '%')
else:
print ('keine Regelschleife, Stellwert:', STELLWERT, '%')
pwm.ChangeDutyCycle (STELLWERT)
#print ('Test:', STELLWERT, ' %')
except:
print ('Fehler')
time.sleep(1)
def main():
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWM_PIN, GPIO.OUT)
pwm = GPIO.PWM(PWM_PIN, 400)
parser = ConfigParser()
pwm.start(0)
while True:
emparts = abrufen()
regeln(emparts,pwm,STELLWERT)
finally:
pwm.stop()
GPIO.cleanup()
def stopping(emparts,config):
"""
* executed on daemon stop
* do some cleanup / close filehandles if needed and so on...
"""
print("quitting")
#close filehandles
def config(config):
"""
* executed on daemon config init
* do some configuration stuff...
"""
global sw_debug
sw_debug = int(config.get('debug', 0))
print("sample: feature enabled")
if __name__ == '__main__':
main()
Alles anzeigen
Aktuell macht mir hier nur das "finally" in der Zeile 131 Probleme.
Das bekomme ich irgendwie nicht hin.
Ist das so richtig, dass ich in Zeile 130 diese drei Werte mit übergebe?
Ich würde mich freuen, wenn hier nochmal wer drüber schauen könnte.
Vielen Dank!
Generell, und da ich noch nicht ausreichend Zeit zum Testen hatte gilt:
Anwendung auf eigene Gefahr!
Keine Garantie oder Gewährleistung!
Gruß
Homemade