Python skript. Shelly3EM lesen und akku-ladenetzteil steuern. Was geht einfacher, eleganter?

Das skript lieset die power vom shelly 3EM aus und steuert mein akkulader netzteil über seriell auf nulleinspeisung.

Netzteil Kiprim DC310S (Owon relabel) 30V 10A 80 eur auf amazon. Der shelly 3EM ist im schaltkasten und geht über WiFi.

Bin nicht so der python profi, da geht vieles sicher einfacher. Konstruktive kommentare wilkommen.

import time
import urllib.request as request
import json
import serial
port = 'com7'
shelly = '192.168.178.47'
def getshelly():
with request.urlopen('http://' + shelly + '/status') as response:
if response.getcode() == 200:
source = response.read()
data = json.loads(source)
return float(data["total_power"])
else:
print('shelly error')
return 0
actpower = 0.0
powerreq = 0.0
chargeamps = 0.0
chargevolt = 27.2
ser = serial.Serial(port, 115200, timeout=0)
ser.write('*idn?\r\n'.encode('utf-8'))
time.sleep(0.2)
rx = ser.readline()
if len(rx) >= 1:
print(rx.decode("utf-8"))
# ser.write('MEAS:VOLT?\r\n'.encode('utf-8'))
# time.sleep(0.2)
# rx = ser.readline()
# if len(rx) >= 1:
#   chargevolt = round(float(rx.decode("utf-8").strip()),2)
#   print('volt ' + str(chargevolt))
while True:
actpower = getshelly()
print('shellypwr ' + str(actpower))
ser.write('MEAS:CURR?\r\n'.encode('utf-8'))
time.sleep(0.2)
rx = ser.readline()
if len(rx) >= 1:
chargeamps = round(float(rx.decode("utf-8").strip()),2)
print('amps ' + str(chargeamps))
powerreq = round(chargeamps * chargevolt - actpower,0)
print('requestpwr ' + str(powerreq))
if powerreq > 1 :
reqamps = round(powerreq / chargevolt,2)
if reqamps > 10:
reqamps = 10
else:
reqamps = 0
print('reqamps ' + str(reqamps))
ampstr = 'CURR ' + str(reqamps) + '\r\n'
ser.write(ampstr.encode('utf-8'))
time.sleep(5.0)
print()
# netzteil protokoll, Kiprim/Owon 30V 10A, 80 eur.
# id = #*idn?
# reset = *rst
# getvolt = MEAS:VOLT?
# getcurrent = MEAS:CURR?
# getpower = MEAS:POW?
# on/off = OUTP ON or OUTP OFF
# set current = CURR 1.3 (in A)
# set voltage = VOLT 10.2 (in V)