Python Typkonvertierung nicht explizit genug

Allgemeine Fragen zum Thema SmartHome in openWB
Antworten
Smarty
Beiträge: 4
Registriert: Mo Sep 27, 2021 7:16 pm

Python Typkonvertierung nicht explizit genug

Beitrag von Smarty »

Hallo Entwickler,

ein Gerät im Smarthome 2.0 schaltet nicht korrekt ab, offensichtlich gibt es ein Problem mit den Datentypen. Mit meinem beschränkten Überblick über die Struktur der openWB-Scripts finde ich aber den Fehler selbst nicht. Wahrscheinlich fehlt irgendwo ein simples str().

Das hier ist der entsprechende Auszug aus smarthome.log:

Code: Alles auswählen

2022-06-15 09:19:24-: (1) Poolpumpe Maximale Einschaltdauer erreicht schalte ab
2022-06-15 09:19:24-: (1) on / off Shttp 1 none Fehlermeldung: Can't convert 'int' object to str implicitly 
Hier ein Screenshot der Konfiguration in der openWB. Die URL geht an Edomi, dort wird der entsprechende KNX-Aktor-Kanal auf 0 oder 1 gesetzt, was auch manuell (also im Browser) wunderbar funktioniert.
konfig.png
Die installierte Version ist 1.9.272.

Gibt es eigentlich irgendwo ein Beispiel, wie man am besten mit https://documen.tician.de/pudb/ in der openWB auf Fehlersuche geht? Dann könnte ich u.U. kontruktiver mithelfen.

Vielen Dank!
okaegi
Beiträge: 2185
Registriert: Fr Mär 08, 2019 1:57 pm

Re: Python Typkonvertierung nicht explizit genug

Beitrag von okaegi »

Der Fehler ist im folgend PR korrigiert.
https://github.com/snaptec/openWB/pull/2252
Es ist tatsächlich so, dass der Überschuss nicht als String übergeben wurde.

Alt:

Code: Alles auswählen


        argumentList = ['python3', self._prefixpy + 'http' + pname,
                        str(self.device_nummer), '0',
                        self.devuberschuss, url]
        try:
            self.proc = subprocess.Popen(argumentList)
            self.proc.communicate()
Neu

Code: Alles auswählen

        argumentList = ['python3', self._prefixpy + 'http' + pname,
                        str(self.device_nummer), '0',
                        str(self.devuberschuss), url]
        try:
            self.proc = subprocess.Popen(argumentList)
            self.proc.communicate()
Zur Fehlersuche im Smartmq:
Wichtigstes Instrument ist das Smarthome.log. Bei jeder relevanten Entscheidung sollte etwas gelogt werden. In der Regel reicht es dann, die entsprechende Stelle im Programm zu finden um den Fehler einzugrenzen.

Code: Alles auswählen

    def turndevicerelais(self, zustand, ueberschussberechnung, updatecnt):
        self.preturn(zustand, ueberschussberechnung, updatecnt)
        if (zustand == 1):
            pname = "/on.py"
            url = self._device_einschalturl
        else:
            pname = "/off.py"
            url = self._device_ausschalturl

        argumentList = ['python3', self._prefixpy + 'http' + pname,
                        str(self.device_nummer), '0',
                        str(self.devuberschuss), url]
        try:
            self.proc = subprocess.Popen(argumentList)
            self.proc.communicate()
        except Exception as e1:
            self.logClass(2, "(" + str(self.device_nummer) +
                          ") on / off %s %d %s Fehlermeldung: %s "
                          % ('Shttp', self.device_nummer,
                             str(self._device_ip), str(e1)))
Die letzte Fehlermeldung hast du mit self.LogClass im Smarthome log. Die hast du ja gefunden.

Was auch noch manchmal hilft: Einige Devices machen je nach Typ noch ein separates logging auf der Ramdisk. Diese fangen in der regel mit ...ramdisk/deviceN oder ...ramdisk/smarthome_device_...N an.
(wobei N dann 1 bis 9 ist).

Struktur vom smartmq ist einfach:
openWB/runs/smartmq -> Main programm
openWB/runs/usmarthome/smart....py -> classendefinition
smartbase0.py-> Basisclasse (0) für alles
smartbase.py -> zentrale Basisclasse mit Regellogik für alle Typen
smartbut.py -> Smartbutton class
smartmeas.py -> alle Classen für separate Leistungsmessung (SDM630, shelly, tasmota...)
smartxxxx.py -> z.b. ...IDM.py , ...shelly.py separate Classen für jeden Typ
Die Classen werden pro Device instanziiert und rufen dann die unteren Module zur direkten Ansteuerung auf.

openWB/modules/smarthome/shelly/on.py, off.py, watt.py

Diese Module machen dann ggf zusätzliches logging auf der ramdisk.

Gruss Oliver
Entwickler- openWB (ehrenamtlich) / Feedback zu Funktionen immer erwünscht..
Smarthomeprobleme siehe hier (update :!: ): viewtopic.php?f=14&t=5923
Smarty
Beiträge: 4
Registriert: Mo Sep 27, 2021 7:16 pm

Re: Python Typkonvertierung nicht explizit genug

Beitrag von Smarty »

Hallo Oliver & Team,

vielen Dank für den schnellen Bugfix und die ausführliche Antwort! Ich habe mir den Beitrag gleich mal für später gespeichert.
Seit dem eingefügten str() an der richtigen Stelle funktioniert das Ein- und Ausschalten im Smarthome 2.0 perfekt.

Beste Grüße,
Smarty
Antworten