Tasmota Nous Sockets mit Python verwalten

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ß.

Mikka
Mikka
Ultrahiker und Ultra-Light Hiker. Technopilger, T1D, Mediziner. Was sonst?

5 Kommentare

Hinterlasse einen Kommentar.

Du kannst auf Fediverse-Profile verlinken, indem du @benutzername@server.tld in deinem Kommentar eingibst.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert