Content warning: Erster Schritt in der Häusle-Tech war es, die meisten Sachen im Haus an Tasmota Nous A1T Steckdosen anzustecken. Das Besondere an diesen Dingern ist, dass sie eine eigene IP Addresse haben, mit der man sie in Home Assistant einbinden kann oder halt auch m
Erster Schritt in der Häusle-Tech war es, die meisten Sachen im Haus an Tasmota Nous A1T Steckdosen anzustecken. Das Besondere an diesen Dingern ist, dass sie eine eigene IP Addresse haben, mit der man sie in Home Assistant einbinden kann oder halt auch mit einem sehr einfachen Python script steuern kann.
Erstmal das Script: #!/path/to/.venv/bin/pythonimport sysimport requestsimport jsonsys.path.append("/path/to/.venv/lib/")SOCKETS = [ {"ip": "192.168.1.2", "alias": "Socket One (Mikka's Room)"}, # Add more sockets with IP addresses and aliases as needed]def control_sockets(command): if command not in ["on", "off", "toggle"]: print("Invalid command. Use 'on','off', or 'toggle'.") return for socket in SOCKETS: ip = socket["ip"] alias = socket["alias"] url = f"http://{ip}/cm?cmnd=Power%20{command.capitalize()}" try: response = requests.get(url, timeout=5) if response.status_code == 200: print(f"Successfully turned {command} socket '{alias}' at {ip}") else: print(f"Failed to turn {command} socket '{alias}' at {ip}. Status code: {response.status_code}") except requests.RequestException as e: print(f"Error communicating with socket '{alias}' at {ip}: {e}")def get_power_usage(ip): url = f"http://{ip}/cm?cmnd=Status%208" try: response = requests.get(url, timeout=5) if response.status_code == 200: data = response.json() today = data.get('StatusSNS', {}).get('ENERGY', {}).get('Today', 0) yesterday = data.get('StatusSNS', {}).get('ENERGY', {}).get('Yesterday', 0) total = data.get('StatusSNS', {}).get('ENERGY', {}).get('Total', 0) return today, yesterday, total else: print(f"Failed to get usage data from {ip}. Status code: {response.status_code}") except requests.RequestException as e: print(f"Error communicating with socket at {ip}: {e}") return None, None, Nonedef show_usage(): total_today = 0 total_yesterday = 0 total_all_time = 0 for socket in SOCKETS: ip = socket["ip"] alias = socket["alias"] today, yesterday, total = get_power_usage(ip) if today is not None: print(f"{alias}:") print(f" Today: {today:.2f} kWh") print(f" Yesterday: {yesterday:.2f} kWh") print(f" Total: {total:.2f} kWh") print() total_today += today total_yesterday += yesterday total_all_time += total print("Total usage across all sockets:") print(f" Today: {total_today:.2f} kWh") print(f" Yesterday: {total_yesterday:.2f} kWh") print(f" All-time: {total_all_time:.2f} kWh")if __name__ == "__main__": if len(sys.argv) != 2: print("Usage: tasmota <on|off|toggle|usage>") sys.exit(1) command = sys.argv[1].lower() if command == "usage": show_usage() else: control_sockets(command) So geht’s:
Script kopieren und in eine Text-Datei in einem Folder irgendwo ablegen.
In dem Folder ein Terminal aufmachen und ein Python Virtual Environment anlegen
(Sich merken wo das ist)
requests installieren (pip install requests)
Im Script den Pfad im Hashbang und im sys.path anpassen und das Gemerkte oben einfügen.
IP Addressen und Aliase angeben
Script ausführbar machen (chmod u+x oder ug+x)
Script soft in den Pfad verlinken
Profit
Und so schaut das dann aus! Achtung: Die Tasmota API hat keine zusätzliche Sicherung durch Passwort. Wenn Du also nicht willst, dass Jede:r, der in Deinem Netzwerk ist, Deine Sachen an und ausschalten kann, solltest Du die Dinger in ein eigenes, per ACL gesichertes Subnetz einlegen. In meinem Fall kann nur mein Handy, mein Computer, und der Home Assistant auf dieses Netz zugreifen.