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/python
import sys
import requests
import json
sys.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, None
def 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
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.
Viel Spaß.