"Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Ulanzie Clock Anzeige TC001 für einzelne Daten.

Moderatoren: Ulrich, mr.big

dbfan75
Beiträge: 124
Registriert: Sa 2. Jul 2022, 14:25
Hat sich bedankt: 21 Mal
Danksagung erhalten: 2 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von dbfan75 »

Hi, habe ich gemacht.
Aber irgendwie läuft das Script nicht.


Hier mal die Einträge in der ulanziconnect.py

Code: Alles auswählen

#!/usr/bin/env python3
#
# Ulanzi->Solaranzeige Connector V0.20

# benötigte Bibliotheken importieren
import logging
import requests
import bs4 as bs
import time

# diverse Einstellungen
VERSION_NR = "0.20"

SOLARANZEIGE_URL = "http://192.168.178.240" # URL der Solaranzeige
ULANZI_URL = "http://192.168.178.47" # URL der Ulanzi Pixelclock

WERTE = ("solaranzeige,PV,Gesamtleistung","solaranzeige,Batterie,SOC","solaranzeige,Summen,Wh_Heute",)

START_ZEIT = "06:00" # Start der Darstellung der Werte auf Ulanzi-Clock
STOP_ZEIT = "22:30" # Ende der Darstellung der Werte auf Ulanzi-Clock

LOG_DATEI = "/home/pi/scripts/ulanzi.log" # Pfad und Name der Logdatei
LOG_LEVEL = "INFO"  # NOTSET =0, DEBUG =10, INFO =20, WARN =30, ERROR =40, and CRITICAL =50

# ab hier bitte nichts mehr ändern!

# Logging definieren
logging.basicConfig(filename=LOG_DATEI, level=logging.getLevelName(LOG_LEVEL),
                    format='%(asctime)s - %(message)s',
                    datefmt='%d-%b-%y %H:%M:%S')

## Funktionen definieren ##
# Funktion URL auf Verfügbarkeit testen
def url_verfuegbar(url):
    try:
        r = requests.get(url)
        return r.status_code == 200
    except requests.exceptions.ConnectionError:
        return False
# Ende Funktion url_verfuegbar
#
# Funktion zur Abfrage der Daten aus der DB über API
def db_abfrage(DATENBANK,MEASUREMENT,DATENPUNKT):
      XML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" \
            "<solaranzeige><version>1.0</version>" \
            "<in_out>out</in_out>" \
            "<database name=\""+DATENBANK+"\">" \
            "<measurement name=\""+MEASUREMENT+"\">" \
            "<fieldname name=\""+DATENPUNKT+"\">" \
            "</fieldname>" \
            "</measurement>" \
            "</database></solaranzeige>"
      logging.debug(XML)
      headers = {'Content-Type': 'application/xml'} # set what your server accepts
      data = (requests.post(SOLARANZEIGE_URL+"/api/control.php", data=XML, headers=headers).text)
      logging.debug(data)
      soup = bs.BeautifulSoup(data,"xml")
      for wert in soup.find_all('fieldname'):
        return DATENBANK,MEASUREMENT,DATENPUNKT,wert.text
# Ende Funktion db_abfrage
#
# Funktion Ulanzi senden
def ulanzi_senden(url,data):
    response = requests.post(url, json=data)
    logging.info(f'{url},{data}')
# Ende Funktion ulanzi_senden
#
# Funktion intro
def intro():
    url = ULANZI_URL + '/api/notify'
    data = {
        "text": "Ulanzi->Solaranzeige Connector Version "+str(VERSION_NR),
        "rainbow": bool(1),
        "repeat": 1
    }
    ulanzi_senden(url,data)
# Ende Funktion intro
#
# Start Funktion Ulanzi An/Aus schalten
def ulanzi_an_aus(x):
    url = ULANZI_URL + '/api/power'
    data = {
        "power": bool(x),
    }
    ulanzi_senden(url,data)
# Ende Funktion Ulanzi An/Aus
#
# Start Funtion Loop
def loop():

    WERT = db_abfrage(DATENBANK,MEASUREMENT,DATENPUNKT)

    ################################# Beginn Block Auswertung #################################

    if ((WERT[0])+","+(WERT[1])+","+(WERT[2])) == "solaranzeige,PV,Gesamtleistung":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?name="+(WERT[1])+"_"+(WERT[2])

        data = {
            "text": str(int(float(WERT[3]))) + " W",
            "icon": 27283,
            "rainbow": bool(1),
            "duration": 10
        }
        ulanzi_senden(url,data)
    ################################## Ende Block Auswertung ##################################

    ################################# Beginn Block Auswertung #################################

    elif (WERT[0])+","+(WERT[1])+","+(WERT[2]) == "solaranzeige,Summen,Wh_Heute":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?"+(WERT[1])+"_"+(WERT[2])

        data = {
            "text": str(round((float((WERT[3])) / 1000), 2))+" kWh",
            "icon": 51301,
            "color": [252, 186, 3],
            "duration": 10
        }
        ulanzi_senden(url,data)

    ################################## Ende Block Auswertung ##################################


  ################################# Beginn Block Auswertung #################################

    elif (wert[0])+","+(wert[1])+","+(wert[2]) == "solaranzeige,Batterie,SOC":
        print(wert[3])

        url = ulanzi_url + "/api/custom?"+(wert[1])+"_"+(wert[2])

        if int(wert[3]) >= 1 and int(wert[3]) <= 10:
            data = {
                "text": (wert[3]) + " %",
                "icon": 12832,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 11 and int(wert[3]) <= 30:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6359,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 31 and int(wert[3]) <= 50:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6360,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 51 and int(wert[3]) <= 70:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6361,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 71 and int(wert[3]) <= 90:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6362,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 91 and int(wert[3]) <= 100:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6363,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

    ################################## Ende Block Auswertung ##################################










    else:
        print("Nope, keine Auswertung verfügbar für "+str(WERT[0])+","+str(WERT[1])+","+(WERT[2]))
# Ende Funktion Loop

## Programm starten ##
print(str(url_verfuegbar(SOLARANZEIGE_URL))+" -> Solaranzeige verfügbar")
if not (url_verfuegbar(SOLARANZEIGE_URL)):
    exit("Solaranzeige unter der eingegeben URL nicht erreichbar!")

print(str(url_verfuegbar(ULANZI_URL))+" -> Ulanzi verfügbar")
if not (url_verfuegbar(ULANZI_URL)):
    exit("Ulanzi unter der eingegeben URL nicht erreichbar!")

# Ulanzi anschalten
ulanzi_an_aus(1)

# Intro senden
intro()
time.sleep(8)

# Loop starten
while True:

    uhrzeit = time.strftime("%H:%M")
    #print(uhrzeit)

    if uhrzeit >= START_ZEIT and uhrzeit < STOP_ZEIT:
        ulanzi_an_aus(1)

        zaehler = 0
        for element in WERTE:
            D_M_D = (WERTE[zaehler].split(","))
            print(D_M_D)
            DATENBANK = (D_M_D[0])
            MEASUREMENT = (D_M_D[1])
            DATENPUNKT = (D_M_D[2])
            loop()
            time.sleep(5)
            zaehler = zaehler + 1
    else:
        ulanzi_an_aus(0)
        print(uhrzeit+"  Pause, ausserhalb \"Start - Stop\" Bereich!")
        time.sleep(60)

[/quote]


Hier die Ausgabe wo der Fehler liegt.

[quote]

pi@raspberrypi:~ $ /home/pi/scripts/ulanziconnect.py
True -> Solaranzeige verfügbar
True -> Ulanzi verfügbar
['solaranzeige', 'PV', 'Gesamtleistung']
3883.47
['solaranzeige', 'Batterie', 'SOC']
Traceback (most recent call last):
  File "/home/pi/scripts/ulanziconnect.py", line 235, in <module>
    loop()
  File "/home/pi/scripts/ulanziconnect.py", line 129, in loop
    elif (wert[0])+","+(wert[1])+","+(wert[2]) == "solaranzeige,Batterie,SOC":
NameError: name 'wert' is not defined
pi@raspberrypi:~ $

dbfan75
Beiträge: 124
Registriert: Sa 2. Jul 2022, 14:25
Hat sich bedankt: 21 Mal
Danksagung erhalten: 2 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von dbfan75 »

Ja, das habe ich und bekomme diese Ausgabe.

Code: Alles auswählen

pi@raspberrypi:~ $ /home/pi/scripts/ulanziconnect.py
True -> Solaranzeige verfügbar
True -> Ulanzi verfügbar
['solaranzeige', 'PV', 'Gesamtleistung']
1959.97
['solaranzeige', 'Batterie', 'SOC']
Traceback (most recent call last):
  File "/home/pi/scripts/ulanziconnect.py", line 235, in <module>
    loop()
  File "/home/pi/scripts/ulanziconnect.py", line 129, in loop
    elif (wert[0])+","+(wert[1])+","+(wert[2]) == "solaranzeige,Batterie,SOC":
NameError: name 'wert' is not defined
pi@raspberrypi:~ $

Benutzeravatar
mr.big
Beiträge: 595
Registriert: Mi 7. Sep 2022, 12:12
Wohnort: tief im Osten...
Hat sich bedankt: 15 Mal
Danksagung erhalten: 121 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von mr.big »

Womit hast du das script bearbeitet? Es fehlen ja komplett jegliche Einrückungen! So kann das nicht laufen!

Benutzeravatar
mr.big
Beiträge: 595
Registriert: Mi 7. Sep 2022, 12:12
Wohnort: tief im Osten...
Hat sich bedankt: 15 Mal
Danksagung erhalten: 121 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von mr.big »

Code: Alles auswählen

#!/usr/bin/env python3
#
# Ulanzi->Solaranzeige Connector V0.20

# benötigte Bibliotheken importieren
import logging
import requests
import bs4 as bs
import time

# diverse Einstellungen
VERSION_NR = "0.20"

SOLARANZEIGE_URL = "http://192.x.x.x" # URL der Solaranzeige
ULANZI_URL = "http://192.x.x.x" # URL der Ulanzi Pixelclock

WERTE = ("solaranzeige,PV,Leistung","solaranzeige,Summen,Wh_GesamtHeute",)

START_ZEIT = "06:00" # Start der Darstellung der Werte auf Ulanzi-Clock
STOP_ZEIT = "22:30" # Ende der Darstellung der Werte auf Ulanzi-Clock

LOG_DATEI = "/home/pi/scripts/ulanzi.log" # Pfad und Name der Logdatei
LOG_LEVEL = "INFO"  # NOTSET =0, DEBUG =10, INFO =20, WARN =30, ERROR =40, and CRITICAL =50

# ab hier bitte nichts mehr ändern!

# Logging definieren
logging.basicConfig(filename=LOG_DATEI, level=logging.getLevelName(LOG_LEVEL),
                    format='%(asctime)s - %(message)s',
                    datefmt='%d-%b-%y %H:%M:%S')

## Funktionen definieren ##
# Funktion URL auf Verfügbarkeit testen
def url_verfuegbar(url):
    try:
        r = requests.get(url)
        return r.status_code == 200
    except requests.exceptions.ConnectionError:
        return False
# Ende Funktion url_verfuegbar
#
# Funktion zur Abfrage der Daten aus der DB über API
def db_abfrage(DATENBANK,MEASUREMENT,DATENPUNKT):
      XML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" \
            "<solaranzeige><version>1.0</version>" \
            "<in_out>out</in_out>" \
            "<database name=\""+DATENBANK+"\">" \
            "<measurement name=\""+MEASUREMENT+"\">" \
            "<fieldname name=\""+DATENPUNKT+"\">" \
            "</fieldname>" \
            "</measurement>" \
            "</database></solaranzeige>"
      logging.debug(XML)
      headers = {'Content-Type': 'application/xml'} # set what your server accepts
      data = (requests.post(SOLARANZEIGE_URL+"/api/control.php", data=XML, headers=headers).text)
      logging.debug(data)
      soup = bs.BeautifulSoup(data,"xml")
      for wert in soup.find_all('fieldname'):
        return DATENBANK,MEASUREMENT,DATENPUNKT,wert.text
# Ende Funktion db_abfrage
#
# Funktion Ulanzi senden
def ulanzi_senden(url,data):
    response = requests.post(url, json=data)
    logging.info(f'{url},{data}')
# Ende Funktion ulanzi_senden
#
# Funktion intro
def intro():
    url = ULANZI_URL + '/api/notify'
    data = {
        "text": "Ulanzi->Solaranzeige Connector Version "+str(VERSION_NR),
        "rainbow": bool(1),
        "repeat": 1
    }
    ulanzi_senden(url,data)
# Ende Funktion intro
#
# Start Funktion Ulanzi An/Aus schalten
def ulanzi_an_aus(x):
    url = ULANZI_URL + '/api/power'
    data = {
        "power": bool(x),
    }
    ulanzi_senden(url,data)
# Ende Funktion Ulanzi An/Aus
#
# Start Funtion Loop
def loop():

    WERT = db_abfrage(DATENBANK,MEASUREMENT,DATENPUNKT)

    ################################# Beginn Block Auswertung #################################

    if ((WERT[0])+","+(WERT[1])+","+(WERT[2])) == "solaranzeige,PV,Leistung":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?name="+(WERT[1])+"_"+(WERT[2])

        data = {
            "text": str(int(float(WERT[3]))) + " W",
            "icon": 27283,
            "rainbow": bool(1),
            "duration": 3
        }
        ulanzi_senden(url,data)
    ################################## Ende Block Auswertung ##################################

    ################################# Beginn Block Auswertung #################################

    elif (WERT[0])+","+(WERT[1])+","+(WERT[2]) == "solaranzeige,Summen,Wh_GesamtHeute":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?"+(WERT[1])+"_"+(WERT[2])

        data = {
            "text": str(round((float((WERT[3])) / 1000), 2))+" kWh",
            "icon": 51301,
            "color": [252, 186, 3],
            "duration": 3
        }
        ulanzi_senden(url,data)

    ################################## Ende Block Auswertung ##################################

    else:
        print("Nope, keine Auswertung verfügbar für "+str(WERT[0])+","+str(WERT[1])+","+(WERT[2]))
# Ende Funktion Loop

## Programm starten ##
print(str(url_verfuegbar(SOLARANZEIGE_URL))+" -> Solaranzeige verfügbar")
if not (url_verfuegbar(SOLARANZEIGE_URL)):
    exit("Solaranzeige unter der eingegeben URL nicht erreichbar!")

print(str(url_verfuegbar(ULANZI_URL))+" -> Ulanzi verfügbar")
if not (url_verfuegbar(ULANZI_URL)):
    exit("Ulanzi unter der eingegeben URL nicht erreichbar!")

# Ulanzi anschalten
ulanzi_an_aus(1)

# Intro senden
intro()
time.sleep(8)

# Loop starten
while True:

    uhrzeit = time.strftime("%H:%M")
    #print(uhrzeit)

    if uhrzeit >= START_ZEIT and uhrzeit < STOP_ZEIT:
        ulanzi_an_aus(1)

        zaehler = 0
        for element in WERTE:
            D_M_D = (WERTE[zaehler].split(","))
            print(D_M_D)
            DATENBANK = (D_M_D[0])
            MEASUREMENT = (D_M_D[1])
            DATENPUNKT = (D_M_D[2])
            loop()
            time.sleep(5)
            zaehler = zaehler + 1
    else:
        ulanzi_an_aus(0)
        print(uhrzeit+"  Pause, ausserhalb \"Start - Stop\" Bereich!")
        time.sleep(60)
So muss das ausschauen! Die Leerstellen an den "Zeilenanfängen" sind wichtig und müssen exakt so sein!

dbfan75
Beiträge: 124
Registriert: Sa 2. Jul 2022, 14:25
Hat sich bedankt: 21 Mal
Danksagung erhalten: 2 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von dbfan75 »

Ja so sieht das bei mir aus.

Benutze das Programm " MobaXterm ".

Code: Alles auswählen

#!/usr/bin/env python3
#
# Ulanzi->Solaranzeige Connector V0.20

# benötigte Bibliotheken importieren
import logging
import requests
import bs4 as bs
import time

# diverse Einstellungen
VERSION_NR = "0.20"

SOLARANZEIGE_URL = "http://192.168.178.240" # URL der Solaranzeige
ULANZI_URL = "http://192.168.178.47" # URL der Ulanzi Pixelclock

WERTE = ("solaranzeige,PV,Gesamtleistung","solaranzeige,Batterie,SOC","solaranzeige,Summen,Wh_Heute",)

START_ZEIT = "06:00" # Start der Darstellung der Werte auf Ulanzi-Clock
STOP_ZEIT = "22:30" # Ende der Darstellung der Werte auf Ulanzi-Clock

LOG_DATEI = "/home/pi/scripts/ulanzi.log" # Pfad und Name der Logdatei
LOG_LEVEL = "INFO"  # NOTSET =0, DEBUG =10, INFO =20, WARN =30, ERROR =40, and CRITICAL =50

# ab hier bitte nichts mehr ändern!

# Logging definieren
logging.basicConfig(filename=LOG_DATEI, level=logging.getLevelName(LOG_LEVEL),
                    format='%(asctime)s - %(message)s',
                    datefmt='%d-%b-%y %H:%M:%S')

## Funktionen definieren ##
# Funktion URL auf Verfügbarkeit testen
def url_verfuegbar(url):
    try:
        r = requests.get(url)
        return r.status_code == 200
    except requests.exceptions.ConnectionError:
        return False
# Ende Funktion url_verfuegbar
#
# Funktion zur Abfrage der Daten aus der DB über API
def db_abfrage(DATENBANK,MEASUREMENT,DATENPUNKT):
      XML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" \
            "<solaranzeige><version>1.0</version>" \
            "<in_out>out</in_out>" \
            "<database name=\""+DATENBANK+"\">" \
            "<measurement name=\""+MEASUREMENT+"\">" \
            "<fieldname name=\""+DATENPUNKT+"\">" \
            "</fieldname>" \
            "</measurement>" \
            "</database></solaranzeige>"
      logging.debug(XML)
      headers = {'Content-Type': 'application/xml'} # set what your server accepts
      data = (requests.post(SOLARANZEIGE_URL+"/api/control.php", data=XML, headers=headers).text)
      logging.debug(data)
      soup = bs.BeautifulSoup(data,"xml")
      for wert in soup.find_all('fieldname'):
        return DATENBANK,MEASUREMENT,DATENPUNKT,wert.text
# Ende Funktion db_abfrage
#
# Funktion Ulanzi senden
def ulanzi_senden(url,data):
    response = requests.post(url, json=data)
    logging.info(f'{url},{data}')
# Ende Funktion ulanzi_senden
#
# Funktion intro
def intro():
    url = ULANZI_URL + '/api/notify'
    data = {
        "text": "Ulanzi->Solaranzeige Connector Version "+str(VERSION_NR),
        "rainbow": bool(1),
        "repeat": 1
    }
    ulanzi_senden(url,data)
# Ende Funktion intro
#
# Start Funktion Ulanzi An/Aus schalten
def ulanzi_an_aus(x):
    url = ULANZI_URL + '/api/power'
    data = {
        "power": bool(x),
    }
    ulanzi_senden(url,data)
# Ende Funktion Ulanzi An/Aus
#
# Start Funtion Loop
def loop():

    WERT = db_abfrage(DATENBANK,MEASUREMENT,DATENPUNKT)

    ################################# Beginn Block Auswertung #################################

    if ((WERT[0])+","+(WERT[1])+","+(WERT[2])) == "solaranzeige,PV,Gesamtleistung":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?name="+(WERT[1])+"_"+(WERT[2])

        data = {
            "text": str(int(float(WERT[3]))) + " W",
            "icon": 27283,
            "rainbow": bool(1),
            "duration": 10
        }
        ulanzi_senden(url,data)
    ################################## Ende Block Auswertung ##################################

    ################################# Beginn Block Auswertung #################################

    elif (WERT[0])+","+(WERT[1])+","+(WERT[2]) == "solaranzeige,Summen,Wh_Heute":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?"+(WERT[1])+"_"+(WERT[2])

        data = {
            "text": str(round((float((WERT[3])) / 1000), 2))+" kWh",
            "icon": 51301,
            "color": [252, 186, 3],
            "duration": 10
        }
        ulanzi_senden(url,data)

    ################################## Ende Block Auswertung ##################################


  ################################# Beginn Block Auswertung #################################

    elif (wert[0])+","+(wert[1])+","+(wert[2]) == "solaranzeige,Batterie,SOC":
        print(wert[3])

        url = ulanzi_url + "/api/custom?"+(wert[1])+"_"+(wert[2])

        if int(wert[3]) >= 1 and int(wert[3]) <= 10:
            data = {
                "text": (wert[3]) + " %",
                "icon": 12832,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 11 and int(wert[3]) <= 30:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6359,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 31 and int(wert[3]) <= 50:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6360,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 51 and int(wert[3]) <= 70:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6361,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 71 and int(wert[3]) <= 90:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6362,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 91 and int(wert[3]) <= 100:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6363,
                "color": [154, 250, 10],
                "duration": 5
            }
            ulanzi_senden(url,data)

    ################################## Ende Block Auswertung ##################################










    else:
        print("Nope, keine Auswertung verfügbar für "+str(WERT[0])+","+str(WERT[1])+","+(WERT[2]))
# Ende Funktion Loop

## Programm starten ##
print(str(url_verfuegbar(SOLARANZEIGE_URL))+" -> Solaranzeige verfügbar")
if not (url_verfuegbar(SOLARANZEIGE_URL)):
    exit("Solaranzeige unter der eingegeben URL nicht erreichbar!")

print(str(url_verfuegbar(ULANZI_URL))+" -> Ulanzi verfügbar")
if not (url_verfuegbar(ULANZI_URL)):
    exit("Ulanzi unter der eingegeben URL nicht erreichbar!")

# Ulanzi anschalten
ulanzi_an_aus(1)

# Intro senden
intro()
time.sleep(8)

# Loop starten
while True:

    uhrzeit = time.strftime("%H:%M")
    #print(uhrzeit)

    if uhrzeit >= START_ZEIT and uhrzeit < STOP_ZEIT:
        ulanzi_an_aus(1)

        zaehler = 0
        for element in WERTE:
            D_M_D = (WERTE[zaehler].split(","))
            print(D_M_D)
            DATENBANK = (D_M_D[0])
            MEASUREMENT = (D_M_D[1])
            DATENPUNKT = (D_M_D[2])
            loop()
            time.sleep(5)
            zaehler = zaehler + 1
    else:
        ulanzi_an_aus(0)
        print(uhrzeit+"  Pause, ausserhalb \"Start - Stop\" Bereich!")
        time.sleep(60)

Benutzeravatar
mr.big
Beiträge: 595
Registriert: Mi 7. Sep 2022, 12:12
Wohnort: tief im Osten...
Hat sich bedankt: 15 Mal
Danksagung erhalten: 121 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von mr.big »

Ich schau mir den " MobaXterm " heute Abend mal an, eventuell kann man da ja was einstellen, melde mich morgen dazu!

dbfan75
Beiträge: 124
Registriert: Sa 2. Jul 2022, 14:25
Hat sich bedankt: 21 Mal
Danksagung erhalten: 2 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von dbfan75 »

Hallo mr.big,

bin ein Stück weiter gekommen und läuft jetzt auch. Habe unter Zeile 237 beim Eitrag "loop()" eine Raute " #loop()" davor gesetzt und es lief.


Leider werden mir danach aber keine Werte mehr angezeigt.

Code: Alles auswählen

Jul 02 09:47:20 raspberrypi systemd[1]: Started Ulanzi-Solaranzeige-Connector Service.
pi@raspberrypi:~ $ /home/pi/scripts/ulanziconnect.py
True -> Solaranzeige verfügbar
True -> Ulanzi verfügbar
['solaranzeige', 'PV', 'Gesamtleistung']
['solaranzeige', 'Batterie', 'SOC']
['solaranzeige', 'Summen', 'Wh_Heute']
['solaranzeige', 'PV', 'Gesamtleistung']
['solaranzeige', 'Batterie', 'SOC']
['solaranzeige', 'Summen', 'Wh_Heute']
['solaranzeige', 'PV', 'Gesamtleistung']
['solaranzeige', 'Batterie', 'SOC']
['solaranzeige', 'Summen', 'Wh_Heute']
['solaranzeige', 'PV', 'Gesamtleistung']
['solaranzeige', 'Batterie', 'SOC']
['solaranzeige', 'Summen', 'Wh_Heute']
['solaranzeige', 'PV', 'Gesamtleistung']
['solaranzeige', 'Batterie', 'SOC']
['solaranzeige', 'Summen', 'Wh_Heute']
['solaranzeige', 'PV', 'Gesamtleistung']
['solaranzeige', 'Batterie', 'SOC']
Am Ulanzi wird nur die aktuelle Einspeisung angezeigt.

Benutzeravatar
mr.big
Beiträge: 595
Registriert: Mi 7. Sep 2022, 12:12
Wohnort: tief im Osten...
Hat sich bedankt: 15 Mal
Danksagung erhalten: 121 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von mr.big »

Wichtig!!!

Bitte Scripte/Code immer in "Code anzeigen" Tags setzten Das ist oben in der Leiste das "</>"
Symbol!

Poste so noch einmal dein Script wie es jetzt ist!

Dein Editor ist ok! Mit dem sollte das eigentlich klappen!


code.jpg

dbfan75
Beiträge: 124
Registriert: Sa 2. Jul 2022, 14:25
Hat sich bedankt: 21 Mal
Danksagung erhalten: 2 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von dbfan75 »

Hi, so sieht das script jetzt aus.

Code: Alles auswählen

#!/usr/bin/env python3
#
# Ulanzi->Solaranzeige Connector V0.20

# benötigte Bibliotheken importieren
import logging
import requests
import bs4 as bs
import time

# diverse Einstellungen
VERSION_NR = "0.20"

SOLARANZEIGE_URL = "http://192.168.178.240" # URL der Solaranzeige
ULANZI_URL = "http://192.168.178.47" # URL der Ulanzi Pixelclock

WERTE = ("solaranzeige,PV,Gesamtleistung","solaranzeige,Batterie,SOC","solaranzeige,Summen,Wh_Heute",)

START_ZEIT = "06:00" # Start der Darstellung der Werte auf Ulanzi-Clock
STOP_ZEIT = "22:30" # Ende der Darstellung der Werte auf Ulanzi-Clock

LOG_DATEI = "/home/pi/scripts/ulanzi.log" # Pfad und Name der Logdatei
LOG_LEVEL = "INFO"  # NOTSET =0, DEBUG =10, INFO =20, WARN =30, ERROR =40, and CRITICAL =50

# ab hier bitte nichts mehr ändern!

# Logging definieren
logging.basicConfig(filename=LOG_DATEI, level=logging.getLevelName(LOG_LEVEL),
                    format='%(asctime)s - %(message)s',
                    datefmt='%d-%b-%y %H:%M:%S')

## Funktionen definieren ##
# Funktion URL auf Verfügbarkeit testen
def url_verfuegbar(url):
    try:
        r = requests.get(url)
        return r.status_code == 200
    except requests.exceptions.ConnectionError:
        return False
# Ende Funktion url_verfuegbar
#
# Funktion zur Abfrage der Daten aus der DB über API
def db_abfrage(DATENBANK,MEASUREMENT,DATENPUNKT):
      XML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" \
            "<solaranzeige><version>1.0</version>" \
            "<in_out>out</in_out>" \
            "<database name=\""+DATENBANK+"\">" \
            "<measurement name=\""+MEASUREMENT+"\">" \
            "<fieldname name=\""+DATENPUNKT+"\">" \
            "</fieldname>" \
            "</measurement>" \
            "</database></solaranzeige>"
      logging.debug(XML)
      headers = {'Content-Type': 'application/xml'} # set what your server accepts
      data = (requests.post(SOLARANZEIGE_URL+"/api/control.php", data=XML, headers=headers).text)
      logging.debug(data)
      soup = bs.BeautifulSoup(data,"xml")
      for wert in soup.find_all('fieldname'):
        return DATENBANK,MEASUREMENT,DATENPUNKT,wert.text
# Ende Funktion db_abfrage
#
# Funktion Ulanzi senden
def ulanzi_senden(url,data):
    response = requests.post(url, json=data)
    logging.info(f'{url},{data}')
# Ende Funktion ulanzi_senden
#
# Funktion intro
def intro():
    url = ULANZI_URL + '/api/notify'
    data = {
        "text": "Ulanzi->Solaranzeige Connector Version "+str(VERSION_NR),
        "rainbow": bool(1),
        "repeat": 1
    }
    ulanzi_senden(url,data)
# Ende Funktion intro
#
# Start Funktion Ulanzi An/Aus schalten
def ulanzi_an_aus(x):
    url = ULANZI_URL + '/api/power'
    data = {
        "power": bool(x),
    }
    ulanzi_senden(url,data)
# Ende Funktion Ulanzi An/Aus
#
# Start Funtion Loop
def loop():

    WERT = db_abfrage(DATENBANK,MEASUREMENT,DATENPUNKT)

    ################################# Beginn Block Auswertung #################################

    if ((WERT[0])+","+(WERT[1])+","+(WERT[2])) == "solaranzeige,PV,Gesamtleistung":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?name="+(WERT[1])+"_"+(WERT[2])

        data = {
            "text": str(int(float(WERT[3]))) + " W",
            "icon": 27283,
            "rainbow": bool(1),
            "duration": 10
        }
        ulanzi_senden(url,data)
    ################################## Ende Block Auswertung ##################################
    


    ################################# Beginn Block Auswertung #################################

    elif (WERT[0])+","+(WERT[1])+","+(WERT[2]) == "solaranzeige,Summen,Wh_Heute":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?"+(WERT[1])+"_"+(WERT[2])

        data = {
            "text": str(round((float((WERT[3])) / 1000), 2))+" kWh",
            "icon": 51301,
            "color": [252, 186, 3],
            "duration": 10
        }
        ulanzi_senden(url,data)

    ################################## Ende Block Auswertung ##################################


    ################################# Beginn Block Auswertung #################################

    elif (wert[0])+","+(wert[1])+","+(wert[2]) == "solaranzeige,Batterie,SOC":
        print(wert[3])

        url = ulanzi_url + "/api/custom?"+(wert[1])+"_"+(wert[2])

        if int(wert[3]) >= 1 and int(wert[3]) <= 10:
            data = {
                "text": (wert[3]) + " %",
                "icon": 12832,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 11 and int(wert[3]) <= 30:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6359,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 31 and int(wert[3]) <= 50:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6360,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 51 and int(wert[3]) <= 70:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6361,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 71 and int(wert[3]) <= 90:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6362,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url,data)

        elif int(wert[3]) >= 91 and int(wert[3]) <= 100:
            data = {
                "text": (wert[3]) + " %",
                "icon": 6363,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url,data)

    ################################## Ende Block Auswertung ##################################










    else:
        print("Nope, keine Auswertung verfügbar für "+str(WERT[0])+","+str(WERT[1])+","+(WERT[2]))
# Ende Funktion Loop

## Programm starten ##
print(str(url_verfuegbar(SOLARANZEIGE_URL))+" -> Solaranzeige verfügbar")
if not (url_verfuegbar(SOLARANZEIGE_URL)):
    exit("Solaranzeige unter der eingegeben URL nicht erreichbar!")

print(str(url_verfuegbar(ULANZI_URL))+" -> Ulanzi verfügbar")
if not (url_verfuegbar(ULANZI_URL)):
    exit("Ulanzi unter der eingegeben URL nicht erreichbar!")

# Ulanzi anschalten
ulanzi_an_aus(1)

# Intro senden
intro()
time.sleep(8)

# Loop starten
while True:

    uhrzeit = time.strftime("%H:%M")
    #print(uhrzeit)

    if uhrzeit >= START_ZEIT and uhrzeit < STOP_ZEIT:
        ulanzi_an_aus(1)

        zaehler = 0
        for element in WERTE:
            D_M_D = (WERTE[zaehler].split(","))
            print(D_M_D)
            DATENBANK = (D_M_D[0])
            MEASUREMENT = (D_M_D[1])
            DATENPUNKT = (D_M_D[2])
            #loop()
            time.sleep(5)
            zaehler = zaehler + 1
    else:
        ulanzi_an_aus(0)
        print(uhrzeit+"  Pause, ausserhalb \"Start - Stop\" Bereich!")
        time.sleep(60)


Benutzeravatar
mr.big
Beiträge: 595
Registriert: Mi 7. Sep 2022, 12:12
Wohnort: tief im Osten...
Hat sich bedankt: 15 Mal
Danksagung erhalten: 121 Mal

Re: "Ulanzi->Solaranzeige Connector" Ulanzi Pixelclock zur externen Visualisierung!

Beitrag von mr.big »

Ok, habe leider etwas "Mischmasch" generiert, die Beispiele sind schon für eine neuere Version angepasst, die ist aber noch in Arbeit und kommt erst im Laufe der Woche! Habe das ganze jetzt angepasst, müsste so bei dir so laufen. Öffne bitte dein script und ersetze es mit folgendem Code

Code: Alles auswählen

#!/usr/bin/env python3
#
# Ulanzi->Solaranzeige Connector V0.20

# benötigte Bibliotheken importieren
import logging
import requests
import bs4 as bs
import time

# diverse Einstellungen
VERSION_NR = "0.20"

SOLARANZEIGE_URL = "http://192.168.178.240"  # URL der Solaranzeige
ULANZI_URL = "http://192.168.178.47"  # URL der Ulanzi Pixelclock

WERTE = ("solaranzeige,PV,Gesamtleistung", "solaranzeige,Batterie,SOC", "solaranzeige,Summen,Wh_Heute",)

START_ZEIT = "06:00"  # Start der Darstellung der Werte auf Ulanzi-Clock
STOP_ZEIT = "22:30"  # Ende der Darstellung der Werte auf Ulanzi-Clock

LOG_DATEI = "/home/pi/scripts/ulanzi.log"  # Pfad und Name der Logdatei
LOG_LEVEL = "INFO"  # NOTSET =0, DEBUG =10, INFO =20, WARN =30, ERROR =40, and CRITICAL =50

# ab hier bitte nichts mehr ändern!

# Logging definieren
logging.basicConfig(filename=LOG_DATEI, filemode='w', level=logging.getLevelName(LOG_LEVEL),
                    format='%(asctime)s - %(message)s',
                    datefmt='%d-%b-%y %H:%M:%S')


## Funktionen definieren ##
# Funktion URL auf Verfügbarkeit testen
def url_verfuegbar(url):
    try:
        r = requests.get(url)
        return r.status_code == 200
    except requests.exceptions.ConnectionError:
        return False


# Ende Funktion url_verfuegbar
#
# Funktion zur Abfrage der Daten aus der DB über API
def db_abfrage(DATENBANK, MEASUREMENT, DATENPUNKT):
    XML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" \
          "<solaranzeige><version>1.0</version>" \
          "<in_out>out</in_out>" \
          "<database name=\"" + DATENBANK + "\">" \
                                            "<measurement name=\"" + MEASUREMENT + "\">" \
                                                                                   "<fieldname name=\"" + DATENPUNKT + "\">" \
                                                                                                                       "</fieldname>" \
                                                                                                                       "</measurement>" \
                                                                                                                       "</database></solaranzeige>"
    logging.debug(XML)
    headers = {'Content-Type': 'application/xml'}  # set what your server accepts
    data = (requests.post(SOLARANZEIGE_URL + "/api/control.php", data=XML, headers=headers).text)
    logging.debug(data)
    soup = bs.BeautifulSoup(data, "xml")
    for wert in soup.find_all('fieldname'):
        return DATENBANK, MEASUREMENT, DATENPUNKT, wert.text


# Ende Funktion db_abfrage
#
# Funktion Ulanzi senden
def ulanzi_senden(url, data):
    response = requests.post(url, json=data)
    logging.info(f'{url},{data}')


# Ende Funktion ulanzi_senden
#
# Funktion intro
def intro():
    url = ULANZI_URL + '/api/notify'
    data = {
        "text": "Ulanzi->Solaranzeige Connector Version " + str(VERSION_NR),
        "rainbow": bool(1),
        "repeat": 1
    }
    ulanzi_senden(url, data)


# Ende Funktion intro
#
# Start Funktion Ulanzi An/Aus schalten
def ulanzi_an_aus(x):
    url = ULANZI_URL + '/api/power'
    data = {
        "power": bool(x),
    }
    ulanzi_senden(url, data)


# Ende Funktion Ulanzi An/Aus
#
# Start Funtion Loop
def loop():
    WERT = db_abfrage(DATENBANK, MEASUREMENT, DATENPUNKT)

    ################################# Beginn Block Auswertung #################################

    if ((WERT[0]) + "," + (WERT[1]) + "," + (WERT[2])) == "solaranzeige,PV,Gesamtleistung":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?name=" + (WERT[1]) + "_" + (WERT[2])

        data = {
            "text": str(int(float(WERT[3]))) + " W",
            "icon": 27283,
            "rainbow": bool(1),
            "duration": 10
        }
        ulanzi_senden(url, data)
    ################################## Ende Block Auswertung ##################################

    ################################# Beginn Block Auswertung #################################

    elif (WERT[0]) + "," + (WERT[1]) + "," + (WERT[2]) == "solaranzeige,Summen,Wh_Heute":
        print(WERT[3])

        url = ULANZI_URL + "/api/custom?" + (WERT[1]) + "_" + (WERT[2])

        data = {
            "text": str(round((float((WERT[3])) / 1000), 2)) + " kWh",
            "icon": 51301,
            "color": [252, 186, 3],
            "duration": 10
        }
        ulanzi_senden(url, data)

    ################################## Ende Block Auswertung ##################################

    ################################# Beginn Block Auswertung #################################

    elif (WERT[0]) + "," + (WERT[1]) + "," + (WERT[2]) == "solaranzeige,Batterie,SOC":
        print(WERT[3])

        url = ulanzi_url + "/api/custom?" + (WERT[1]) + "_" + (WERT[2])

        if int(WERT[3]) >= 1 and int(WERT[3]) <= 10:
            data = {
                "text": (WERT[3]) + " %",
                "icon": 12832,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url, data)

        elif int(WERT[3]) >= 11 and int(WERT[3]) <= 30:
            data = {
                "text": (WERT[3]) + " %",
                "icon": 6359,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url, data)

        elif int(WERT[3]) >= 31 and int(WERT[3]) <= 50:
            data = {
                "text": (WERT[3]) + " %",
                "icon": 6360,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url, data)

        elif int(WERT[3]) >= 51 and int(WERT[3]) <= 70:
            data = {
                "text": (WERT[3]) + " %",
                "icon": 6361,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url, data)

        elif int(WERT[3]) >= 71 and int(WERT[3]) <= 90:
            data = {
                "text": (WERT[3]) + " %",
                "icon": 6362,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url, data)

        elif int(WERT[3]) >= 91 and int(WERT[3]) <= 100:
            data = {
                "text": (WERT[3]) + " %",
                "icon": 6363,
                "color": [154, 250, 10],
                "duration": 10
            }
            ulanzi_senden(url, data)

    ################################## Ende Block Auswertung ##################################

    else:
        print("Nope, keine Auswertung verfügbar für " + str(WERT[0]) + "," + str(WERT[1]) + "," + (WERT[2]))


# Ende Funktion Loop

## Programm starten ##
print(str(url_verfuegbar(SOLARANZEIGE_URL)) + " -> Solaranzeige verfügbar")
if not (url_verfuegbar(SOLARANZEIGE_URL)):
    exit("Solaranzeige unter der eingegeben URL nicht erreichbar!")

print(str(url_verfuegbar(ULANZI_URL)) + " -> Ulanzi verfügbar")
if not (url_verfuegbar(ULANZI_URL)):
    exit("Ulanzi unter der eingegeben URL nicht erreichbar!")

# Ulanzi anschalten
ulanzi_an_aus(1)

# Intro senden
intro()
time.sleep(8)

# Loop starten
while True:

    uhrzeit = time.strftime("%H:%M")
    # print(uhrzeit)

    if uhrzeit >= START_ZEIT and uhrzeit < STOP_ZEIT:
        ulanzi_an_aus(1)

        zaehler = 0
        for element in WERTE:
            D_M_D = (WERTE[zaehler].split(","))
            print(D_M_D)
            DATENBANK = (D_M_D[0])
            MEASUREMENT = (D_M_D[1])
            DATENPUNKT = (D_M_D[2])
            loop()
            time.sleep(10)
            zaehler = zaehler + 1
    else:
        ulanzi_an_aus(0)
        print(uhrzeit + "  Pause, ausserhalb \"Start - Stop\" Bereich!")
        time.sleep(60)

Antworten

Zurück zu „Ulanzi Anzeige TC001“