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.