Moin,
vorweg eine Bitte: meine Variablennamen sind tlw. Abkürzungen, ich ändere das gelegentlich![]()
- Boot-Datei mit Zeitabfrage über DS3231
- "Script" zur Überwachung und Steuerung meiner Akkuanlage für PV-Module
Wenn ich das "Testprogramm" laufen lasse, wird regelmäßig die Zeit mit "zeit_setzen" ohne Probleme abgefragt.
Mein "Script" erzeugt bei der zweiten Abfrage von "zeit_setzen" immer einen OSError: [Errno 116] ETIMEDOUT?
i2c.scan() ergibt :
>>> i2c.scan()
[80, 81, 82, 83, 84, 85, 86, 87, 104]
>>>
- Boot
Python
# boot.py für VictronMon Solarregler 05.08.26 mit Zeitabfrage
import esp
import network
import webrepl
import machine
import time
from time import sleep
from machine import I2C, Pin
from machine import SoftI2C
import utime
import credentials
#i2c = SoftI2C(scl=Pin(33), sda=Pin(32)) #, freq=100000)
i2c = I2C(0, scl=Pin(33), sda=Pin(32)) #, freq=100000)
DS3231_I2C_ADDR = 0x68
i2c.scan()
stunde = ()
esp.osdebug(None)
SSID = credentials.SSID
PASSWORD = credentials.PASSWORD
station = network.WLAN(network.STA_IF)
#station.active(True)
#station.active(False)
station.active(True)
station.connect(SSID, PASSWORD)
sleep(5)
print('Connection successful')
print(" 30 ",station.ifconfig())
def bcd2dec(b):
return (b // 16) * 10 + (b % 16)
def zeit_setzen():
data = i2c.readfrom_mem(DS3231_I2C_ADDR, 0x00, 7)
sleep(3)
sekunde = bcd2dec(data[0])
minute = bcd2dec(data[1])
monat = bcd2dec(data[5] & 0x1f)
stunde =bcd2dec(data[2] & 0x3f)
#print("Stunde MEZ :", stunde)
zeitzone = 1
#print ("Monat ", monat)
if (monat >=4) and (monat <=10):
zeitzone = 2
stunde = bcd2dec(data[2]+zeitzone & 0x3f) # 24h-Format
tag = bcd2dec(data[4])
jahr = bcd2dec(data[6]) + 2000
#print ("stunde nach Korrektur Sommer-Winter ", stunde)
#return jahr, monat, tag, stunde, minute, sekunde
return stunde, minute, sekunde
utime.sleep(5)
stunde, minute, sekunde = zeit_setzen()
print("boot 34 ",stunde, minute, sekunde)
#webrepl.start()
Display More
meine kleines Testprogramm:
Code
# test_zeitabfrage.py
stunde=() #i
minute = 0
sekunde = 0
stunde, minute, sekunde = zeit_setzen() #stunde, minute, sekunde)
while True:
print ("8 ",stunde, minute, sekunde)
sleep(1)
mein Script:
Python
main - VictronMon Solarregler auslesen 05.08.2026;
from time import sleep
import machine
from machine import RTC, UART, Pin
from umqttsimple import MQTTClient
import gc
led=Pin(2,Pin.OUT)
led(0)
#LEDs links 13 direct gelb, 12 akku grün
#LEDs rechts 22 direct gelb, 18 akku grün 22 direct gelb, 18 akku grün
MQTT_SERVER = "192.168.178.58" # Raspi2
#MQTT_SERVER = "broker.emqx.io" # funktioniert gut
#MQTT_SERVER = 'crystalmq.bevywise.com'
MQTT_USER = credentials.MQTT_USER
MQTT_PASSWORD = credentials.MQTT_PASSWORD
MQTT_CLIENT_ID = machine.unique_id().hex().encode("ascii")
global stat, volt, counter
TOPIC_SUB1 = (b"inverter15421012025_net/akku_manuell/links")
TOPIC_SUB2 = (b"inverter15421012025_net/akku_manuell/rechts")
def connect_mqtt():
try:
client = MQTTClient(client_id=MQTT_CLIENT_ID,
server=MQTT_SERVER,
user=MQTT_USER,
password=MQTT_PASSWORD)
client.connect()
print("30 client connected ")
return client
except Exception as e:
print("33 Fehler :",e)
sleep(10)
machine.reset()
def sub_cb(topic, msg):
for a in range(0,1):
if topic == (b'inverter15421012025_net/akku_manuell/links'):
print(' 40 Nachricht empfangen Akku links',msg)
f = open('a_full_l.csv','w')
if msg == (b'1'):
f.write ('1')
elif msg == (b'0'):
f.write ('0')
f.close()
if topic == (b'inverter15421012025_net/akku_manuell/rechts'):
print(' 48 Nachricht empfangen Akku rechts',msg)
f = open('a_full_r.csv','w')
if msg == (b'1'):
f.write ('1')
elif msg == (b'0'):
f.write ('0')
f.close()
def subscribe(client):
client.set_callback(sub_cb)
client.subscribe(TOPIC_SUB1)
client.subscribe(TOPIC_SUB2)
def restart_and_reconnect(): #3 VersuchPRÜFEM
a=0
for a in range(0,3):
sleep(10) #evtl. noch länger
machine.reset()
def parse_data(data, last_three_serial_number_bytes):
a=0
stat = volt = power = ""
try:
index = data.index(b"CS")
sleep(5)
except Exception as e:
print("72 ", e)
sleep(3)
machine.reset() #oder auswertung_uart neu aufrufen
else:
digit = data[index + 3 : index + 4]
if digit == b"3":
stat = "Bulk "
elif digit == b"4":
stat = "Absorp"
elif digit == b"5":
stat = "Float"
elif digit == b"0":
stat = "Off"
try:
index = data.index(last_three_serial_number_bytes)
except Exception as e:
print ("92 Fehler :",e)
sleep(3)
machine.reset()
else:
volt = data[index + 7 : index + 12]
try:
index = data.index(b"H20")
except Exception as e:
print ("100 Fehler :",e)
sleep(3)
machine.reset()
else:
power = data[index + 4 : index + 7]
return stat, volt, power
def auswertung_uart():
status_r = volt_r = power_r =""
status_l = volt_l =power_l = ""
uart_r = UART(1, baudrate=19200, tx=32, rx=34) # nur rx ist notwendig
uart_l = UART(2, baudrate=19200, tx=33, rx=35)
if gc.mem_free() < 102000:
gc.collect()
led(1)
sleep (1)
led(0)
#data_r = uart_r.read(250)
#data_l = uart_l.read(250)
data_r = b'\nSER#\tHQ2224Y7NTA\r\nV\t28320\r\nI\t10\r\nVPV\t46310\r\nPPV\t0\r\nCS\t4\r\nMPPT\t1\r\nOR\t0x00000000\r\nERR\t0\r\nLOAD\tOFF\r\nIL\t0\r\nH19\t24807\r\nH20\t101\r\nH21\t406\r\nH22\t112\r\nH23\t387\r\nHSDS\t192\r\nChecksum\tA\r\nPID\t0xA053\r\nFW\t164\r\nSER#\tHQ2224Y7NTA\r\nV\t28320\r\nI\t10\r\nVPV\t46300\r\nPPV\t0\r\nCS\t5\r\nMPPT\t1\r\nOR\t0x00000000\r\nERR\t0\r\nLOAD\tOFF\r\nI000\r\nERR\t0\r\nLOAD\tOFF\r\nIL\t0\r\nH19\t24807\r\nH20\t101\r\nH21\t406\r\nH22\t112\r\nH23\t387\r\nHSDS\t192\r\nChecksum\t?'
data_l = b'\t164\r\nSER#\tHQ2048JQL3U\r\nV\t28300\r\nI\t10\r\nVPV\t45510\r\nPPV\t0\r\nCS\t4\r\nMPPT\t1\r\nOR\t0x00000000\r\nERR\t0\r\nLOAD\tOFF\r\nIL\t0\r\nH19\t25253\r\nH20\t95\r\nH21\t395\r\nH22\t103\r\nH23\t377\r\nHSDS\t225\r\nChecksum\tg\r\nPID\t0xA053\r\nFW\t164\r\nSER#\tHQ2048JQL3U\r\nV\t28300\r\nI\t10\r\nVPV\t45510\r\nPPV\t0\r\nCS\t5\r\nMPPT\t1\r\nOR\t0x00000000\r\nERR\t0\r\nLOAD\tOFF\r\nI5253\r\nH20\t95\r\nH21\t395\r\nH22\t103\r\nH23\t377\r\nHSDS\t225\r\nChecksum\tg'
status_r, volt_r, power_r = parse_data(data_r, b"NTA")
status_l, volt_l, power_l = parse_data(data_l, b"L3U")
print("128 status_l", status_l, " status_r ", status_r)
f = open ('a_full_l.csv','r')
a_full_l = (f.read())
f.close()
print("133 akku gelesen links ", a_full_l)
f = open ('a_full_r.csv','r')
a_full_r = (f.read())
f.close()
print("137 akku gelesen rechts ", a_full_r)
return status_r, volt_r, power_r, status_l,volt_l,power_l
def auswertungstunde(client):
client = connect_mqtt()
subscribe(client)
a=0
stunde=() #i
minute = 0
sekunde = 0
status_r= volt_r = power_r = status_l=volt_l=power_l = ""
a_full_l = a_full_r =""
feed_in_d_l = Pin(13, Pin.OUT) #LED gelb
feed_in_d_l(0)
le_d_l = '0'
feed_in_a_l =Pin(12, Pin.OUT) #LED grün
feed_in_a_l (0)
le_a_l = '0'
feed_in_d_r = Pin(22, Pin.OUT) #LED gelb
feed_in_d_r(0)
le_d_r = '0'
feed_in_a_r =Pin(18, Pin.OUT) #LED grün
feed_in_a_r (0)
le_a_r = '0'
while True:
sleep(1)
stunde, minute, sekunde = zeit_setzen()
#stunde = int(input("Stunde ")) nur Testbetrieb
print("169 stunde ",stunde)
sleep(2)
if (stunde > 6) and (stunde < 19):
status_r, volt_r, power_r, status_l,volt_l,power_l = auswertung_uart()
if stunde < 19:
if (status_l == "Float"): # or (status_l == "Absorp"):
if a_full_l == "1":
if le_d_l !="1":
le_d_l = "1"
feed_in_d_l (1)
if a_full_l != "1":
a_full_l = "1"
f = open('a_full_l.csv','w')
f.write(a_full_l)
f.close()
feed_in_d_l(1)
le_d_l = '1'
if (status_r == "Float"): # or (status_r == "Absorp"):
if a_full_r == "1":
if le_d_r !="1":
le_d_r = "1"
feed_in_d_r (1)
if a_full_r != "1":
a_full_r = "1"
f = open('a_full_r.csv','w')
f.write(a_full_r)
f.close()
feed_in_d_r(1)
le_d_r = '1'
if stunde == 19:
print("201 alles ausschalten")
feed_in_d_l(0)
feed_in_d_r (0)
feed_in_a_l (0)
feed_in_a_r (0)
le_d_l =le_d_r = '0'
"""
if (status_l == "Absorp"):
a_full_l = "1"
f = open('a_full_l.csv','w')
f.write(a_full_l)
f.close()
if (status_r == "Absorp"):
a_full_r = "1"
f = open('a_full_r.csv','w')
f.write(a_full_r)
f.close()
"""
sleep(10)
if ((stunde >= 20)and (stunde<=23)) or ((stunde >=0)and (stunde <6)):
print(" 233 Einspeisung prüfen")
if a_full_l == "1":
feed_in_a_l (1)
le_a_l = '1'
feed_in_d_l (0)
le_d_l = '0'
if a_full_l =="0":
feed_in_a_l (0)
le_a_l = '0'
if a_full_r == "1":
feed_in_a_r (1)
le_a_r = '1'
feed_in_d_r (0)
le_d_r = '0'
if a_full_r =="0":
feed_in_a_r (0)
le_a_r = '0'
sleep(120)
if stunde == 6:
feed_in_a_l (0)
a_full_l= "0"
le_a_l = '0'
feed_in_d_l (0)
le_d_l= '0'
a_full_l= "0"
f = open('a_full_l.csv','w')
f.write(a_full_l)
f.close()
feed_in_a_r (0)
a_full_r ="0"
le_a_r = '0'
feed_in_d_r (0)
le_d_r = '0'
f = open('a_full_r.csv','w')
f.write(a_full_r)
f.close()
sec= 1 #normalerweise 4 oder noch deutlich höher
try:
#check_message(client)
#for a in range(0,5):
# sleep (sec)
# client.check_msg()
print("272 ", stunde, status_l, volt_l, power_l, a_full_l, le_a_l, le_d_l, status_r, volt_r, power_r, a_full_r, le_a_r, le_d_r)
client.publish(b"inverter15421012025_net/victronre/Stun", str(stunde))
sleep(sec)
client.publish(b"inverter15421012025_net/victronli/St_L", status_l)
sleep(sec)
client.publish(b"inverter15421012025_net/victronli/Vo_L", volt_l)
sleep(sec)
client.publish(b"inverter15421012025_net/victronli/PwrL", power_l)
sleep(sec)
client.publish(b"inverter15421012025_net/victronli/Akku_l", a_full_l)
sleep (sec)
client.publish(b"inverter15421012025_net/victronli/Le_A_l", le_a_l)
sleep(sec)
client.publish(b"inverter15421012025_net/victronli/Le_D_l", le_d_l)
sleep(sec)
client.publish(b"inverter15421012025_net/victronre/St_R", status_r)
sleep(sec)
client.publish(b"inverter15421012025_net/victronre/Vo_R", volt_r)
sleep(sec)
client.publish(b"inverter15421012025_net/victronre/PwrR", power_r)
sleep(sec)
client.publish(b"inverter15421012025_net/victronre/Le_A_r", le_a_r)
sleep(sec)
client.publish(b"inverter15421012025_net/victronre/Le_D_r", le_d_r)
sleep(sec)
client.publish(b"inverter15421012025_net/victronre/Akku_r", a_full_r)
print ("297 Stunde :",stunde, "status_l :", status_l, "status_r :" ,status_r, "akkustand li :" ,a_full_l,"akkustand re :", a_full_r)
sleep(sec)
#check_message(client)
#for a in range(0,5):
# sleep (sec)
# client.check_msg()
except Exception as e:
print ("306 Fehler beim Publish :",e)
sleep(5)
def main():
client = connect_mqtt()
subscribe(client)
auswertungstunde(client)
main()
Display More
die Fehlermeldung:
Code
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot
Connection successful
30 ('192.168.178.153', '255.255.255.0', '192.168.178.1', '192.168.178.1')
boot 34 12 19 26
30 client connected
30 client connected
169 stunde 12 hier ist die Zeit richtig abgeholt worden
128 status_l Absorp status_r Absorp
133 akku gelesen links 1
137 akku gelesen rechts 1
272 12 Absorp b'28300' b'95\r' 0 0 Absorp b'28320' b'101' 0 0
297 Stunde : 12 status_l : Absorp status_r : Absorp akkustand li : akkustand re :
Traceback (most recent call last):
File "<stdin>", line 315, in <module>
File "<stdin>", line 313, in main
File "<stdin>", line 168, in auswertungstunde
File "boot.py", line 37, in zeit_setzen
OSError: [Errno 116] ETIMEDOUT
>>>
Display More