AVM Heizkörperventil Temperatur setzen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Benutzeravatar
__blackjack__
User
Beiträge: 13969
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@El Achimo: Die Fehlerbehandlung ist kaputt. Falls die Anmeldung fehlschlägt, wird trotzdem `set_target_temperature()` aufgerufen, was natürlich nicht funktioniert wenn man nicht angemeldet ist.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
anonym108

Danke für den Tipp.
Das einzige, was in der Exeption schief gehen kann, ist der Login.
Hier ist der angepasste Code.

Code: Alles auswählen

# from pyfritzhome import *
from pyfritzhome import Fritzhome
import sys

# Verbindung zur FRITZ!Box herstellen
host = '10.0.0.1'
username = 'fhem'
password = 'strengstens geheim'
fha = Fritzhome(host=host, user=username, password=password)
try:
   fha.login()
   print ("Login erfolgreich")
except:
   print ("Login fehlgeschlagen")
   sys.exit()
# AIN des Heizkörperreglers
ain = '13979 0362472'  # Beispiel-AIN; ersetzen Sie dies durch die tatsächliche AIN Ihres Geräts
print(ain)
# Neue Solltemperatur in °C
neue_solltemperatur = 15.5

# Setzen der neuen Solltemperatur
fha.set_target_temperature(ain, neue_solltemperatur)
Benutzeravatar
noisefloor
User
Beiträge: 4167
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

man sollte _nie_ nackte `try...except` verwenden, weil man damit _alle_ Fehler abfängt und wegbügelt, auch Programmierfehler. Will man aber in der Regel nicht. Darum Fehler immer gezielt abfangen. Im gegebenen Fall macht es IMHO Sinn, eine `try...except..else`block zu verwenden:

Code: Alles auswählen

...
try:
    fha.login()
    print ("Login erfolgreich")
except LoginError: #<- welche Exception wirklich geworfen wird prüfen und korrigieren
    print ("Login fehlgeschlagen")
else:
    # AIN des Heizkörperreglers
    ain = '13979 0362472'  # Beispiel-AIN; ersetzen Sie dies durch die tatsächliche AIN Ihres Geräts
    print(ain)
    # Neue Solltemperatur in °C
    neue_solltemperatur = 15.5
    # Setzen der neuen Solltemperatur
    fha.set_target_temperature(ain, neue_solltemperatur)
Eingerückt wird gem. PEP8 immer mit 4 Leerzeichen, nicht mit 3 oder wie viel auch immer.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13969
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sich sauber wieder von der Fritzbox abmelden, wäre auch ganz nett.

Code: Alles auswählen

#!/usr/bin/env python3
from pyfritzhome import Fritzhome, LoginError

HOST = "10.0.0.1"
USERNAME = "fhem"
PASSWORD = "strengstens geheim"
HEIZKOERPERREGLER_AIN = "13979 0362472"
NEUE_SOLLTEMPERATUR = 15.5  # in °C


def main():
    fritzhome = Fritzhome(host=HOST, user=USERNAME, password=PASSWORD)
    try:
        fritzhome.login()
    except LoginError:
        print("Login fehlgeschlagen")
    else:
        print("Login erfolgreich")
        print(HEIZKOERPERREGLER_AIN)
        fritzhome.set_target_temperature(
            HEIZKOERPERREGLER_AIN, NEUE_SOLLTEMPERATUR
        )
    finally:
        fritzhome.logout()


if __name__ == "__main__":
    main()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
wonk
User
Beiträge: 18
Registriert: Mittwoch 15. November 2023, 21:29

Hallo,
bist Du sicher, dass es sofunktioniert?
Ich erhalte in der Definitionszeile von fha:
NameError: name 'FritzHome' is not defined
(Ich habe die import-Zeile nicht vergessen, und pyfritzhome ist auch installiert)
Gruss, wonk
Gruss, wonk
Benutzeravatar
__blackjack__
User
Beiträge: 13969
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wonk: `FritzHome` ist ja auch nicht definiert. Das heisst `Fritzhome`.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
wonk
User
Beiträge: 18
Registriert: Mittwoch 15. November 2023, 21:29

Hallo,
sorry, so blöde Fehler sollten eigentlich nicht passieren.
Aber funktionieren tut es trotzdem nicht. Ich bekomme jetzt:

Code: Alles auswählen

Login erfolgreich
Traceback (most recent call last):
  File "/home/pi/fritzpy.py", line 23, in <module>
    fritzhome.set_target_temperature(AIN, 10.0)
  File "/home/pi/.local/lib/python3.9/site-packages/pyfritzhome/fritzhome.py", l                                           ine 321, in set_target_temperature
    self._aha_request("sethkrtsoll", ain=ain, param={"param": temp})
  File "/home/pi/.local/lib/python3.9/site-packages/pyfritzhome/fritzhome.py", l                                           ine 111, in _aha_request
    raise NotLoggedInError
pyfritzhome.errors.NotLoggedInError: not logged in, login before doing any reque                                           sts.
sts
Mein Code dazu:

Code: Alles auswählen

from pyfritzhome import Fritzhome, LoginError
import time

# Zugangsdaten zur FRITZ!Box
fritzbox_ip = "192.168.178.1"  # Standard-IP der FRITZ!Box
benutzername = "smarthome"         # oder dein Benutzername
passwort = "<Passwort dazu>"     # Smarthome-Passwort

fritzhome = Fritzhome(host=fritzbox_ip, user=benutzername, password=passwort)   
try:
    fritzhome.login
except LoginError:
    print ("Login fehlgeschlagen")
else:
    print ("Login erfolgreich")
    time.sleep(60)          # habe ich eingebaut, da ich dachte, zum Login wird Zeit gebraucht
    AIN = "13979 0275556"                  # die ist vorhanden!
    fritzhome.set_target_temperature(AIN, 10.0)
Die Meldung zeigt ja noch, dass das Login klappt, trotzdem die Fehlermeldungen???
"NotLoggedInError"?
Es ändert sich nichts, wenn ich als Parameter für Fritzhome NUR die Werte OHNE Feldnamen eingebe.
Die Verwendung des Hauptbenutzers der FB ändert auch nichts, Rechte des users für Smarthome und Internet habe ich frei gegeben.
Gruss, wonk
Gruss, wonk
Benutzeravatar
Dennis89
User
Beiträge: 1512
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

`fritzhome.login` muss aufgerufen, das macht man mit einem Klammerpaar am Ende, wie in dem Code von @__blackjack__


Grüße
Dennis

Edit: Die Meldung dass das Login erfolgreich war prüft den Login-Vorgang nicht direkt. Wenn man einen Programmierfehler einbaut, dann wird die trotzdem ausgegeben, weil der `try`-Block "erfolgreich" durchlief. Syntaktisch ist auch alles richtig, nur der Code macht eben nichts.
"When I got the music, I got a place to go" [Rancid, 1993]
wonk
User
Beiträge: 18
Registriert: Mittwoch 15. November 2023, 21:29

Hallo,
Danke!
Ich hatte bisher mit der Library fritzconnection gerabeitet, die dieses nicht verlangt. Diese erlaubt allerdings nur ein Lesen, kein Schreiben der Werte.
Das Programm ist jetzt ohne Fehler durchgelaufen. Wenn ich allerdings in der Fritzbox nachschaue, hat sich keine Einstellung des Thermostatventils geändert (auch nach einigem Warten nicht).
Ein Abruf mit fritzhome.get_target_temperature(AIN) liefert zwar den geschriebenen Wert, aber eine solche Funktion finde ich auch in der spärlichen Doku nicht definiert.
fritzhome.get_temperature(AIN) für die aktuelle Temperatur funktioniert.
Im Ergebnis kann ich leider die in der Fritzbox konfigurierte Temperatur so nicht ändern. Wobei der Unterschied zwischen Komfortemperatur und Absenktemperatur sowieso unklar bleibt.
Gruss, wonk
Antworten