FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: bugster_de am 01 Juni 2013, 00:11:43

Titel: FitzBox LAN Utilities
Beitrag von: bugster_de am 01 Juni 2013, 00:11:43
Hi,

nachdem ich mich bei eurem Wissen nun auch schon reichlich bedient habe, möchte ich die Ergebnisse meines verregneten Freitages nun natürlich auch hier wieder posten. Es handelt sich um einen Schwung Routinen, um mit den Geräten, die im sich im LAN / WLAN der Fritzbox befinden zu arbeiten. Getestet auf einer 7390.

Ich habe mir die Funktionen geschrieben, um im weiteren Verlauf z.B. meine Squeezeboxen ansteuern zu können
Szenarien:

Wecker -> SqueezeboxServer per WoL ein --> Verstärker ein --> SqueezeboxSlave ein --> Radio im Badezimmer.
Sprachausgabe zu "Waschmaschine ist fertig" über die Squeezeboxen ausgeben zu können.
Rolladen runter --> kleines Licht an --> Fernseher und HTPC per WoL an

Grundprinzip:
es werden alle Devices, die die FB kennt im einem Array of Hashes abgelegt (Funktion FB_GET_LANDevices). Diese Funktion kann man z.B. periodisch aufrufen und hat so immer eine aktuelle Liste der Geräte inkl. Zustand (online, active, IP, MAC, Name, ID). Danach kann man einer bestimmten Funktion, die halt irgendwas mit so einem Gerät machen soll irgendeinen bekannten Wert des Gerätes mitgeben (z.B. Wake-on-LAN per Device-Name).

Die Funktionen sollten eigentlich soweit alle im jeweiligen Header beschrieben sein und somit selbsterklärend.

Hier ein Beispiel, wie man z.B. die Anwesenheitserkennung machen kann (das geht mit anderen Funktionen sicher einfacher, aber die Routinen sind ja für mehr gedacht):
In der fhem.cfg:
# Update der Anwesenheit
define Anwesenheit dummy
attr Anwesenheit room _Server
attr Anwesenheit setList Anwesend Abwesend
define HomeCheck notify HomeCheck {SomeBodyAtHome( "Anwesenheit" );;}
define UpdateHomeCheck at +*00:05:00 trigger HomeCheck


In der 99_myUtils.pm:
sub SomeBodyAtHome( $ ) {
    my @tmp_devices = ( "Nokia-Vater", "iPhone-Mutter", "Android-Sohn", "iPod-Tochter" );
    my $tmp_success = 0;
    my $tmp_result = 0;
    my $tmp_ret = "Abwesend";

    # erstmal die Geräteliste aktualisieren
    ($tmp_result) = FB_Get_LANDevices( );
    if( $tmp_result ne true ) {
# hier noch nichts zu tun, da eh kein Fehler kommen kann
    }

    foreach( @tmp_devices ) {
($tmp_success, $tmp_result) = FB_Get_LANDeviceStatus( $_ );
if( $tmp_result eq true ) {
   $tmp_ret = "Anwesend";
}
    }
    fhem( "set @_[0] $tmp_ret" );

    # TODO: beim Zustandswechsel Anwesend nach Abwesend soll eine Mail geschickt werden
}


In den Funktionen habe ich nur auf die Routinen von BusyBox sowie ctlmgr_ctl (siehe http://www.wehavemorefun.de/fritzbox/Ctlmgr_ctl (//www.wehavemorefun.de/fritzbox/Ctlmgr_ctl)) zurück gegriffen. Damit sollten die Routinen robust gegen Firmware Upgrades o.ä. sein.


Da ich aus der C/C++ Welt komme sieht mein Code auch so aus. Echte Perl Programmierer können das bestimmt effizienter, aber nach meiner Ansicht sieht echter Perl dann auch so effizient aus, dass man schon nach 1 Stunde nicht mehr weiß, was man programmiert hat :-)
Über Anmerkungen, Verbesserungen, Erweiterungen bin ich natürlich dankbar.
Titel: Aw: FitzBox LAN Utilities
Beitrag von: Puschel74 am 01 Juni 2013, 00:20:04
Hallo,

dann mal ab ins Wiki damit.
Nur durch sowas kann dieses Projekt leben - finde ich.

ZitatEchte Perl Programmierer können das bestimmt effizienter, aber nach meiner Ansicht sieht echter Perl dann auch so effizient aus, dass man schon nach 1 Stunde nicht mehr weiß, was man programmiert hat :-)

Das kann dir auch in C/C++ passieren ;-)
Und auch in jeder anderen Programmiersprache.
Wobei ich meine in meinem Perl-für Dummies-Buch auch so ein Zitat gelesen zu haben ^^

Grüße

P.S.: Ich finde es einfach genial wie man sich hier einbringen kann
Zitatmöchte ich die Ergebnisse meines verregneten Freitages
Dieses Wetter hat auch Vorteile ;-)
Titel: Aw: FitzBox LAN Utilities
Beitrag von: bugster_de am 02 Juni 2013, 08:37:57
Hi,

tja, so hat das schlechte Wetter tatsächlich auch seine Vorteile. Zumal ich gestern dann Funktionen für den Zugriff auf die Telefonfunktionen der FB umgesetzt habe. Sobald der Code in einem Zustand ist, dass ich mich traue in hier rein zu setzen, lade ich den natürlich auch hoch. Momentan kann man die angeschlossenen Telefone, die Rufumleitungen, die Anrufliste und die Wecker auslesen (in der gleichen Manier wie die LAN Devices). Auch kann man somit die Wecker und die Rufumleitungen setzen. Dies ergibt nun die nette Funktion, dass man via FHEM Oberfläche alle Telefone durch Rufumleitung auf den AB stumm schalten kann. Das ist besonders praktisch, wenn unsere Kleine schläft. Dann ist Ruhe. Diese Funktion bietet die FB bisher so nicht (zumindet habe ich nichts gefunden). Somit kann man nun in der Kombination aus LAN und und Anrufliste sehr nett realisieren, dass FHEM die Anrufliste ausliest, sobald man nach Hause kommt und einem auf dem Smartphone signalisiert, ob es während der Abwesenheit Anrufe gab. Nice :-)

ns WIKI würde ich das zwar gerne einstellen, allerdings finde ich den Knopf zum Erstellen eines Login nicht. Ich finde nur den Login, falls man schon einen Account hat.

Die Diskussione bzgl. Programmiersprachen nimmt natürlich auch immer gleich religiöse Züge an. Ich bin kein besonders großer Perl Fan ....
Titel: Aw: FitzBox LAN Utilities
Beitrag von: Puschel74 am 02 Juni 2013, 09:08:04
Hallo,

Zitatns WIKI würde ich das zwar gerne einstellen, allerdings finde ich den Knopf zum Erstellen eines Login nicht.

Du musst ne Mail schicken und einen Acc beantragen.
Ich hab die Mailadresse nicht im Kopf - müsste i-wo auf der Startseite sein.

Grüße
Titel: Aw: FitzBox LAN Utilities
Beitrag von: PeMue am 05 Juni 2013, 10:33:22
Hallo bugster,

ich verweise mal auf meinen Thread (http://forum.fhem.de/index.php?topic=11865.msg79887#msg79887), wo ggf. schon Funktionen für Dich drin sind. Sollen wir die beiden Module zusammenführen? Bin auch gerne bereit, Dein Modul auf meiner Fritz Box 7170 zu testen.
Bei meinem Modul würde ich gerne aus der Fritz Box die Namen der angeschlossenen Telefone auslesen - habe das aber nirgends gefunden, wie das geht.

Gruß Peter
Titel: Aw: FitzBox LAN Utilities
Beitrag von: bugster_de am 05 Juni 2013, 19:49:18
Hi,

ZitatSollen wir die beiden Module zusammenführen?
Sehr gerne. Gibt es Sourceforge oder etwas ähnliches?
Bei mir wird das diese Woche nichts, da Family und Arbeit angesagt sind. Ich komme als frühestens nächste Woche dazu.

Zitathabe das aber nirgends gefunden, wie das geht.
anbei mal mein aktueller Stand der Telefonfunktionen. Achtung: das ist so nicht direkt lauffähig, da ich das etwas große File nun auf mehere aufgeteilt habe. Bitte daher diese Funktion in das 99_FritzBoxUtils.pm reinkopieren oder den Code als Anschauungsbeispiel verwenden.

Mittels sub
ZitatFB_Get_DECTDevices( )
wird eine Liste der aktuell via DECT angeschlossenen Schnurlostelefone erstellt und der Name sowie der Hersteller und der aktuelle Login Status ausgelesen. Man kann theoretisch noch mehr Funktionen auslesen, aber ich brauche eignetlich nicht mehr. Auf meiner 7390 funktioniert das einwandfrei. Ich habe keine Telefone via Kabel angeschlossen und habe deshalb gar nicht probiert, ob und wie man das Namen auslesen kann..
Alle Parameter von DECT siehe hier: http://www.wehavemorefun.de/fritzbox/Dect (//www.wehavemorefun.de/fritzbox/Dect)

Was allerdings momentan nicht ordentlich geht, ist das auslesen der Nebenstellennummer. Ich habe drei Telefone, bei der Nebenstelle jeweils 610, 611, 612 ist. Wenn ich die Nummer auslese kommt aber 60, 61, 62. In der 7390 Konfig steht alerdings **610, **611, **612. Vermutung wäre mal, dass Perl die ** nicht als String sondern als xhochy interpretiert (oder so). Da muß ich mich noch rein fuchsen, aber wie gesagt erst nächste Woche.


Titel: Aw: FitzBox LAN Utilities
Beitrag von: bugster_de am 05 Juni 2013, 19:57:03
und hier auch mal mein Stand der aktuellen Telefonimplementierungen (auch das hier ja Anschauungsbeispiel oder zum rauskopieren).

Hierin sind umgesetzt:
- Auslesen der aktuellen gesetzten Rufumleitungen
- Auslesen der eingestellten Wecker
- einen Wecker einschalten
- einen Wecker ausschalten

Achtung: das mit den Weckern funktioniert echt gut. Ich habe am Samstag abend das ausprobiert und habe wohl im Überschwang der Gefühle vergessen, den Wecker wieder zu löschen. Resultat: Sonntag morgen 5:30h ging das Ding runter. Meine Frau war, sagen wir mal, not amused :-)