Seite 2 von 2

Re: AVM Heizkörperventil Temperatur setzen

Verfasst: Montag 10. März 2025, 09:26
von __blackjack__
@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.

Re: AVM Heizkörperventil Temperatur setzen

Verfasst: Montag 10. März 2025, 10:39
von 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)

Re: AVM Heizkörperventil Temperatur setzen

Verfasst: Montag 10. März 2025, 11:34
von noisefloor
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

Re: AVM Heizkörperventil Temperatur setzen

Verfasst: Montag 10. März 2025, 11:46
von __blackjack__
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()

Re: AVM Heizkörperventil Temperatur setzen

Verfasst: Dienstag 13. Mai 2025, 17:16
von wonk
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

Re: AVM Heizkörperventil Temperatur setzen

Verfasst: Dienstag 13. Mai 2025, 18:20
von __blackjack__
@wonk: `FritzHome` ist ja auch nicht definiert. Das heisst `Fritzhome`.

Re: AVM Heizkörperventil Temperatur setzen

Verfasst: Mittwoch 14. Mai 2025, 19:20
von wonk
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

Re: AVM Heizkörperventil Temperatur setzen

Verfasst: Mittwoch 14. Mai 2025, 19:44
von Dennis89
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.

Re: AVM Heizkörperventil Temperatur setzen

Verfasst: Donnerstag 15. Mai 2025, 10:42
von wonk
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.