DerMitch/fritzbox-smarthome

Library nutzen um Aktoren zu schalten

Closed this issue · 10 comments

Hallo,

ich würde gern mit dieser library meine Aktoren aus meinem Python script auf einem RaspberryPi zu schalten. Leider bin ich noch nicht so erfahren und finde gerade nicht heraus wie ich die nutzen kann.
Mein Gedanke war hier:
import fritzhome
FBox = fritzhome("192.168.178.1","SmartHome","SmartHome")
FBox.set_switch_on("880088008800")
bzw.
FBox.set_switch_off("880088008800")
Der Import geht noch, das andere nicht. Ich bin wie gesagt ganz neu in dem Thema. Daher war meine Vorstellung so, das man ein Objekt für die FritzBox erstellt und dann darüber den Aktor mit der AIM schaltet.
Gibt es sowas wie eine Anleitung wie ich die Befehle nutzen kann/muss?
Danke für die Hilfe.

Mario

Hallo Mario,

ich bin gerade in Neuseeland und kann daher den Code nicht direkt testen. Prinzipiell ist deine Herangehensweise jedoch richtig.

Ein paar Fragen zur Eingrenzung des Problems:

  • Was für eine Fritzbox und was für Aktoren (Modell) verwendest Du?
  • Bekommst du bei set_switch_on/off einen Fehler, oder passiert einfach nichts?
  • Welche Version der Bibliothek verwendest Du? (GitHub / PyPi / ...)
  • Funktioniert das Ein/Ausschalten über das CLI-Tool (fritzhome, siehe README)?

Gibt es sowas wie eine Anleitung wie ich die Befehle nutzen kann/muss?

Eine richtige Dokumentation gibt es leider nicht, da ich die Bibliothek immer nach eigenem Bedarf erweitert habe und mittlerweile selbst nicht mehr aktiv nutze.

Grüße aus Kaiteriteri
Michi

Hallo Michi,

kurz zu meinem Projekt. Ich habe ein kleines Script auf einem RaspberryPi geschrieben. Das läuft automatisch und liest eine Serielle-Schnittstelle aus. Wenn etwas empfangen wurde soll eine Steckdose, an der ein Monitor hängt, eingeschaltet werden. Zur Zeit habe ich das mit einem 433MHz Modul gelöst. Leider ist da die Reichweite nicht so weit. Darum wollte ich das nun mit der DECT200 und einer Fritzbox erweitern. Hier zu hause habe ich eine 6490 von Kabeldeutschland. Nachher soll das mit einer 7390 laufen.
Was ich bis jetzt gemacht habe, um zu testen ob das laufen KÖNNTE(!), ist dies Modul mit "pip3 install fritzhome" zu installieren. Dann habe ich Python3 gestartet und dort einfach mal import fritzhome ausgeführt. Das hat geklappt. Dann wie schon beschrieben Fbox = fritzhome("IP-Adresse",User,Passwort) eingegeben. Doch dabei kommt schon die Fehlermeldung "TypeError: 'module' object ist not callable".
Weiter bin ich nicht gekommen.

Grüße aus Hamburg
Mario

Hallo Mario,

ich sehe schon das Problem. Beim Import (import fritzhome) erhälst du eine Referenz auf ein Modul. Module sind Namensräume in Python, welche selbst wiederum Klassen oder andere Eigenschaften enthalten können. Du versucht das Modul wie eine Funktion/Klasse (fritzhome()) aufzurufen, was in Python nicht möglich ist und zu der Fehlermeldung führt.

Damit es klappt, musst du die Klassse "FritzBox" innerhalb des Moduls verwenden. Hier zwei Beispiele, aus dem Gedächtnis und ungetestet da ich hier keine FritzBox zur Hand habe.

# --- Initialisierung

# Entweder die Klasse einzeln importieren
from fritzhome import FritzBox
fritz = FritzBox("ip", "user", "pw")

# Oder das ganze Modul und dann Zugriff darauf
import fritzhome
fritz = fritzhome.FritzBox("ip", "user", "pw")


# --- Steuerung

# Actors auflisten
print("Meine Actors:")
print(fritz.get_actors())

# Actor an/aus
fritz.set_switch_on("00:00:00:00:00:00")
fritz.set_switch_off("00:00:00:00:00:00")

Grüße aus Kaiteriteri
Michi

Hallo Michi,
das läuft leider auch nicht. Wenn ich die Klasse importieren will, kommt diese Fehlermeldung:
ImportError: cannot import name 'FritzBox'
Wenn ich nur fritzhome importiere kommt in der Befehlszeile
fritz = fritzhome.FritzBox()
dieser Fehler:
AttributeError: module 'fritzhome' has no attribute 'FritzBox'

Ich habe auch das hier probiert:
fritz = fritzhome("IP", "User", "Passwort")
Dann kommt der Fehler
TypeError: 'module' object is not callable

Entweder mache ich etwas ganz verkehrt oder es gibt hier ein Problem
Gruß Mario

Hallo Mario,

entschuldige bitte die späte Rückmeldung - schlechtes Internet in Down Under und Zeitzonen...

Ich habe das nochmal getestet und in meinem Code war noch ein Fehler. Anbei ein Screenshot mit dem richtigen Import. Ich werde das in der Bibliothek noch korrigieren sobald ich wieder im Lande bin.

bildschirmfoto 2017-12-07 um 22 28 16

Zum Kopieren:

import fritzhome
fritz = fritzhome.fritz.FritzBox("192.168.2.2", "smarthome", "smarthome")

Grüße aus Te Anau
Michi

Hallo Michi,
Danke für die Info. Ich hab schon gedacht ich bin total bekloppt. Leider geht das so wie beschrieben auch nicht.
image

Grüße aus dem kalten Norden
Mario

Hallo Mario,

ich habe das nochmal auf ner frischen Linux-Box getestet. Das Problem ist das alte Paket auf PyPi (wird nur selten aktualisiert).

Ich habe das Paket mal aktualisiert. Bitte versuche zuerst ein Update und schau, ob der Import von oben endlich klappt:

# Falls PyPI das Paket endlich hat
pip install fritzhome==1.0.5

# Installation über Direkt-Link
pip install https://pypi.python.org/packages/a2/df/3b6ca1555f075a4014c8866347bc2e882e88247b80a9725ba97ac32ff52d/fritzhome-1.0.5-py2.py3-none-any.whl

Alternative für die alte Version:

import fritzhome.fritz
fritz = fritzhome.fritz.FritzBox("192.168.2.2", "smarthome", "smarthome")

Grüße vom Lake Tekapo
Michi

Hallo Michi,

danke für Deine Unterstützung. Damit läuft es (alte Version). Ist es normal, das get_actors nur den Namen der Steckdose liefert? Kann man auch die AIM dadurch auslesen? Oder kann man auch mit dem Namen die Dose schalten?

Happy holiday.
Mario

Hallo Mario,

Ist es normal, das get_actors nur den Namen der Steckdose liefert?

get_actors liefert dir eine Liste von Aktor-Objekten, welche eine Reihe von Eigenschaften haben, abhängig von der Art des Aktors. Beispiele zur Verwendung findest du in der Datei fritzhome/__main__.py, welche die Basis für das Kommandozeilen-Tool ist.

Besonders die energy-Funktion dürfte für dich interessant sein, diese greift auf Namen, AIN, Status und Temperatur zu und gibt diese aus.

Oder kann man auch mit dem Namen die Dose schalten?

Das direkt nicht. Du könntest jedoch alle Aktoren durchlaufen und nach dem Namen filtern:

for actor in fritz.get_actors():
    if actor.name == "Teekocher":
        actor.switch_on()

Grüße aus Christchurch
Michi

Hallo Michi,

läuft jetzt. Getestet mit FritzBox6490 FW:6.65 und FRITZ!DECT 200 FW:3.87

Danke