Eingerückt wird immer mit 4 Leerzeichen pro Ebene. Variablennamen schreibt man komplett klein, Konstanten dagegen komplett GROSS. Ein Programm strukturiert man mit Funktionen, nicht mit Kommentaren, die keinen Inhalt haben, sondern nur aus =-Zeichen bestehen.
XML ist kein einfacher String, sondern ist ein strukturiertes Format, das man mit einem entsprechenden Parser liest.
Wenn man mit request eine Seite liest, sollte man prüfen, dass das Ergebnis auch fehlerfrei ist.
Der Code für Login-Version 1 und Version 2 ist fast identisch, da wurde also viel kopiert.
Kommentare sollten einen Mehrwert bieten, der Kommentar "Linie ziehen" gefolgt von einem print mit vielen Minuszeichen ist da extrem.
Zudem ist da viel Code, der gar nicht gebraucht wird.
Alles in allem bleibt ungefähr das übrig:
Code: Alles auswählen
#!/usr/bin/env python3
import requests
import hashlib
from influxdb import InfluxDBClient
import xml.etree.ElementTree as et
FRITZBOX_URL = "http://192.168.178.xx"
USERNAME = "xx"
PASSWORD = "xxx"
def login(fritzbox_url, username, password, version=2):
""" Anmeldemethode mit PBKDF2 """
login_response = requests.get(f"{fritzbox_url}/login_sid.lua", params={'version': version})
login_response.raise_for_status()
session_info = et.fromstring(response.content)
sid = session_info.findtext("SID")
block_time = session_info.findtext("BlockTime")
challenge = session_info.findtext("Challenge")
if sid == "0000000000000000":
# SID ist 0, daher Response Erzeugen und neu anfordern
if version == 2:
# Berechnung mit PBKDF2
_, iterations1, salt1, iterations2, salt2 = challenge.split("$")
hash1 = hashlib.pbkdf2_hmac("sha256", password.encode(), bytes.fromhex(salt1), int(iterations1))
hash2 = hashlib.pbkdf2_hmac("sha256", hash1, bytes.fromhex(salt2), int(iterations2))
response = f"{salt2}${hash2.hex()}"
else:
# Berechnung mit MD5
md5 = hashlib.md5(f"{challenge}-{password}".encode("utf_16_le")).hexdigest()
response = f"{challenge}-{md5}"
request_data = {"username": username, "response": response}
login_response = requests.post(f"{fritzbox_url}/login_sid.lua", data=request_data)
login_response.raise_for_status()
session_info = et.fromstring(response.content)
sid = session_info.findtext("SID")
block_time = session_info.findtext("BlockTime")
name = session_info.findtext("Name")
access = session_info.findtext("Access")
print ("Challenge: ", challenge)
print ("Response: ", response)
print ("SID: ", sid)
print ("BlockTime: ", block_time)
print ("Name: ", name)
print ("Access: ", access)
else:
print ("SID: ", sid)
print ("BlockTime: ", block_time)
return sid
def get_device_list_infos(sid):
payload = {'switchcmd': 'getdevicelistinfos', 'sid': sid}
response = requests.get(f"{fritzbox_url}/webservices/homeautoswitch.lua", params=payload)
response.raise_for_status()
device_infos = et.fromstring(response.content)
result = []
for device in device_infos.findall("device"):
device_device_name = device.findtext("name")
if int(device.attrib["functionbitmask"]) & 32:
# Heizkörper
device_hkr_is = float(device.findtext("hkr/tist"))
device_hkr_set = float(device.findtext("hkr/tsoll"))
result.append({
"measurement": device_device_name,
"fields": {
"temp": device_hkr_is,
"temp_set": device_hkr_set
}
})
return result
def main():
client = InfluxDBClient(
host='192.168.178.xx', port=8086,
username='xxxx', password='xxxx', database='shelly_wp'
)
print("------------------------------------------------------------------------")
sid = login(FRITZBOX_URL, USERNAME, PASSWORD)
print("------------------------------------------------------------------------")
device_list = get_device_list_infos(sid)
print(device_list)
client.write_points(device_list)
print("------------------------------------------------------------------------")
if __name__ == "__main__":
main()