AVM Heizkörperventil Temperatur setzen
- __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
Danke für den Tipp.
Das einzige, was in der Exeption schief gehen kann, ist der Login.
Hier ist der angepasste Code.
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)
- 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:
Eingerückt wird gem. PEP8 immer mit 4 Leerzeichen, nicht mit 3 oder wie viel auch immer.
Gruß, noisefloor
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)
Gruß, noisefloor
- __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
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
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
- __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
Hallo,
sorry, so blöde Fehler sollten eigentlich nicht passieren.
Aber funktionieren tut es trotzdem nicht. Ich bekomme jetzt:
Mein Code dazu:
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
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
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)
"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
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.
`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]
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.
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