Verbesserte Home / Zu Hause Funktion Fritzbox (WLan check)

1,310 views
Skip to first unread message

AnonymousHolger

unread,
May 28, 2012, 6:04:10 AM5/28/12
to fhem-...@googlegroups.com
Hallo,

mit viel Hilfe von Rudi, anbei eine verbesserte Homefunktion. ---> Danke Rudi !

Funktion:
Wenn Mobiltelefone über das heimische WLAN auf der Fritzbox registriert werden, wird der User auf den Status "zu Hause" gesetzt.
Die bereits vorliegende zuHause Funktion setzt eine feste LanID in der Fritzbox voraus. Diese LanID kann von der Fritzbox (z.B. bei Neutstart) jedoch geändert werden.
Die neue Routine prüft daher auch, ob der Name der entsprechenden LanID noch dem zu prüfenden, WLAN device entspricht.
Falls dies nicht der Fall ist, werden die LAN-IDs (in meinem Beispiel bis LanID 25) durchsucht und die LanID neu zugeordnet.
Die entsprechenden LanIDs sind in Dummies gespeichert.

Notwendige  Anpassungen:
Routine ist für 2 User definiert (Holger & Maria), ggf. mit suchen/ersetzen anpassen.
Weiterhin muss der DeviceName mit euren Devicenamen stimmen (Holger-IP4 bzw. Maria-IP4S) auch hier ggf. anpassen

Verbesserungsmöglichkeiten:
Die Routine prüft immer dann alle LanIDs, wenn festgestellt wird, dass der Name der LanID nicht mehr dem erwarteten Wert entspricht (<> Holger-IP4 bzw. Maria-IP4S). Das sollte also nur sehr selten passieren (z.B. nach Stromausfall / reboot Fritzbox).
Diese Routine benötigt einige Sekunden um alle LanDevices zu prüfen. Hier ist sicherlich (siehe die Kommentar von Rudi im anderen Thread) Verbesserung möglich, aber "quick and dirty" gehts auch so, und blockiert die FB hoffentlich nur sehr selten, da der Neustart wohl eher selten vorkommt
Weiterhin (siehe ebenfalls Kommentar von Rudi im anderen Thread) wäre die Umsetzung in die my_Utils sinnvoll. Darüber muss ich noch ein wenig "hirnen", da die Übergabe der Parameter für mich als ungeübten "Perler" nicht vor der Hand liegt, es muss ja sowohl der Status der LanID, als auch ggf. die neue LanID übergeben werden.
Der Code gewinnt keinen Schönheitspreis, aber er ist analog zum Autor simple strukturiert und daher sicher auch für Gleichgestrickte verständlich.


Für diejenigen, die es im aktuellen Status nutzen möchten: Anbei der Code

define LanDeviceMaria dummy
define LanDeviceHolger dummy

set LanDeviceMaria 1
set LanDeviceHolger 2

define testwlan at +*00:05:00 {\
  my @Devicelist=("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"."21","22","23","24","25");;\
  my $UserHolgerLanID="";;\
  my $StatusHolgerLanID="";;\
  my $UserMariaLanID="";;\
  my $StatusMariaLanID="";;\
  my $TestUser="";;\
  my $HolgerLanID = Value("LanDeviceHolger");;\
  my $MariaLanID = Value("LanDeviceMaria");;\
  $UserHolgerLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$HolgerLanID/name);;\
  $StatusHolgerLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice1/active);;\
  $StatusHolgerLanID=$StatusHolgerLanID * 1;;\
  $UserMariaLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$MariaLanID/name);;\
  $StatusMariaLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice1/active);;\
  $StatusMariaLanID=$StatusMariaLanID * 1;;\
  if ($UserHolgerLanID =~ m/Holger-IP4/) {\
    if ($StatusHolgerLanID == 1) {\
      if (Value("Holger_zu_Hause") eq "off") {\
        fhem "set HomeStatus ZuHause";;\
      }\
      fhem "set Holger_zu_Hause on";;\
    }\
    else {\
      if (Value("Holger_zu_Hause") eq "on") {\
        if (Value("Maria_zu_Hause") eq "off") {\
          fhem "set HomeStatus NichtzuHause";;\
        }\
      }\
      fhem "set Holger_zu_Hause off";;\
    };;\
  }\
  else {\
    foreach my $lanDev (@Devicelist){\
      $TestUser=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$lanDev/name);;\
      print $TestUser;;\
      if($TestUser =~ m/Holger-IP4/){\
        fhem "set LanDeviceHolger $lanDev";;\
      }\
    }\
  };;\
  if ($UserMariaLanID =~ m/Maria-IP4S/) {\
    if ($StatusMariaLanID == 1) {\
      if (Value("Maria_zu_Hause") eq "off") {\
        fhem "set HomeStatus ZuHause";;\
      }\
      fhem "set Maria_zu_Hause on";;\
    }\
    else {\
      if (Value("Maria_zu_Hause") eq "on") {\
        if (Value("Holger_zu_Hause") eq "off") {\
          fhem "set HomeStatus NichtzuHause";;\
        }\
      }\
      fhem "set Maria_zu_Hause off";;\
    };;\
  }\
  else {\
    foreach my $lanDev (@Devicelist){\
      $TestUser=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$lanDev/name);;\
      print $TestUser;;\
      if($TestUser =~ m/Maria-IP4S/){\
        fhem "set LanDeviceMaria $lanDev";;\
      }\
    }\
  };;\
}









AnonymousHolger

unread,
May 28, 2012, 7:15:34 AM5/28/12
to fhem-...@googlegroups.com
Ups, die gepostete Routine für die fhem.cfg hatte noch kleinere Fehler / Unsauberkeiten für die Prüfung:

Hier korrigiert:

define LanDeviceMaria dummy
attr LanDeviceMaria room 5_SYSTEM
define LanDeviceHolger dummy
attr LanDeviceHolger room 5_SYSTEM


set LanDeviceMaria 1
set LanDeviceHolger 2

define testwlan at +*00:05:00 {\
  my @Devicelist=("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"."21","22","23","24","25");;\

  my $UserHolgerLanID="";;\
  my $StatusHolgerLanID="";;\
  my $UserMariaLanID="";;\
  my $StatusMariaLanID="";;\
  my $TestUser="";;\
  my $HolgerLanID = Value("LanDeviceHolger");;\
  my $MariaLanID = Value("LanDeviceMaria");;\
  $UserHolgerLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$HolgerLanID/name);;\
  $StatusHolgerLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$HolgerLanID/active);;\

  $StatusHolgerLanID=$StatusHolgerLanID * 1;;\
  $UserMariaLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$MariaLanID/name);;\
  $StatusMariaLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$MariaLanID/active);;\
attr testwlan room 5_SYSTEM

Henrik

unread,
May 30, 2012, 3:28:39 PM5/30/12
to FHEM users
Hallo und vielen Dank für den Code,

habs bei mir implementiert und durch suchen ersetzen Namen geändert.
Leider bekomme ich diese Fehlermeldungen. Hast du / habt ihr ne Idee?

Unknown command
@Devicelist=("0","1","2","3","4","5","6","7","8","9","10","11","12","13","1,
try help
Unknown command settings/landevice$HenrikLanID/name);\
, try help
Unknown command settings/landevice$HenrikLanID/active);\
, try help
Unknown command settings/landevice$ElaLanID/name);\
, try help
Unknown command settings/landevice$ElaLanID/active);\
, try help
Unknown command settings/landevice$lanDev/name);\
, try help
Unknown command settings/landevice$lanDev/name);\
, try help

System:
FB 7390
updatefhem vom 30.05.2012

Viele Grüße
und schonmal vielen Dank.

On 28 Mai, 13:15, AnonymousHolger <anonym...@mail2sync.de> wrote:
> Ups, die gepostete Routine für die fhem.cfg hatte noch kleinere Fehler /
> Unsauberkeiten für die Prüfung:
>
> Hier korrigiert:
>
> define LanDeviceMaria dummy
> attr LanDeviceMaria room 5_SYSTEM
> define LanDeviceHolger dummy
> attr LanDeviceHolger room 5_SYSTEM
>
> set LanDeviceMaria 1
> set LanDeviceHolger 2
>
> define testwlan at +*00:05:00 {\
>   my
> @Devicelist=("0","1","2","3","4","5","6","7","8","9","10","11","12","13","1 4","15","16","17","18","19","20"."21","22","23","24","25");;\

AnonymousHolger

unread,
May 30, 2012, 5:08:53 PM5/30/12
to fhem-...@googlegroups.com
Schick mir mal deinen Code, so kann ich dazu nichts sagen.

Henrik

unread,
Jun 2, 2012, 1:59:58 PM6/2/12
to FHEM users
Hallo und vielen Dank,

manchmal hat man Tomaten auf den Augen und dann schaltet man auch noch
das Hirn aus.
Naja, Eure Tipps mit den Zeilenumbrüchen waren goldrichtig. Ich bekomm
auch keine Fehlermeldungen mehr.
Nur stehen jetzt die Dummys LanDeviceEla & LanDeviceHenrik konstant
auf den Werten 1 respektive 2 bei Henrik und ändern ihre Werte auch
nicht.
Diese Werte werden ja am Beginn des Codes gesetzt.

Dann wird doch geprüft welche LanID die Geräte (in meinen Fall doch
Henrik-Telefon, Danielas-iPhone) in der FB zu geordnet bekommt. aber
irgendwie tut sich da nix.
Die Namen der Geräte hab ich aus dem Webfrontend der FB.

Habt ihr/du ne Idee woran es liegen könnte und was man noch tun kann?

Viele Grüße
Henrik

AnonymousHolger

unread,
Jun 2, 2012, 2:14:21 PM6/2/12
to fhem-...@googlegroups.com
Hallo Henrik,

da sind wir ja schon mal 1 Schritt weiter ;-).

Schick mir mal das ERgebnis deines Logs, dann schau ich mir das an.

Noch einmal zur Sicherheit ... dein FHEM läuft auf einer Fritzbox, korrekt ?

Henrik

unread,
Jun 2, 2012, 3:21:50 PM6/2/12
to FHEM users
Hallo Holger,
vielen Dank für die schnelle Hilfe.
anbei der gewünschte Auszug aus dem Logfile.

Argument "" isn't numeric in multiplication (*) at (eval 36) line 1.
Argument "" isn't numeric in multiplication (*) at (eval 36) line 1.
parameter error.
usage:
ctlmgr_ctl <r/w> <ui-module> <key1> [value1]
(r/w: read/write)
examples:
1) ctlmgr_ctl w wlan settings/STA_enabled 1
2) ctlmgr_ctl r wlan settings/STA_enabled
parameter error.
usage:
ctlmgr_ctl <r/w> <ui-module> <key1> [value1]
(r/w: read/write)
examples:
1) ctlmgr_ctl w wlan settings/STA_enabled 1
2) ctlmgr_ctl r wlan settings/STA_enabled
Argument "" isn't numeric in multiplication (*) at (eval 37) line 1.
Argument "" isn't numeric in multiplication (*) at (eval 37) line 1.
parameter error.
usage:
ctlmgr_ctl <r/w> <ui-module> <key1> [value1]
(r/w: read/write)
examples:
1) ctlmgr_ctl w wlan settings/STA_enabled 1
2) ctlmgr_ctl r wlan settings/STA_enabled
parameter error.
usage:
ctlmgr_ctl <r/w> <ui-module> <key1> [value1]
(r/w: read/write)
examples:
1) ctlmgr_ctl w wlan settings/STA_enabled 1
2) ctlmgr_ctl r wlan settings/STA_enabled

so oder ähnlich wiederholt er sich im Log.

Viele Grüße
Henrik

AnonymousHolger

unread,
Jun 2, 2012, 4:43:46 PM6/2/12
to fhem-...@googlegroups.com
HAllo Henrik,

da es in der Routine nur 1 multiplication gibt, würde ich noch mal ausgiebig den Code dort testen.

Ansonsten schick mir noch mal deine Routine und ich schau mir das noch mal an.

Tip für Debuggen:
Ab und zu ein "print " statement aufnehmen, dann siehst du zumindest bis wohin es halbwegs funktioniert - hilft aber auch nicht immer).

Guido

unread,
Jun 29, 2012, 3:44:53 PM6/29/12
to fhem-...@googlegroups.com
Weiterhin (siehe ebenfalls Kommentar von Rudi im anderen Thread) wäre die Umsetzung in die my_Utils sinnvoll.

Hallo,

hab mich heute mal hingesetzt und versucht aus dem vorhandenen (danke an alle die daran beteiligt waren), das in 99_MyUtils.pm umzusetzen, dazu muss ich sagen das ich keinerlei Programmiererfahrungen habe (learning by doing) rausgekommen ist dabei folgendes:

durch die Umsetzung in MyUtils ist es möglich durch Übergabe verschiedener Parameter den Wlan Status einzubinden ohne Anpassungen am Code vornehmen zu müssen. (Userfriendly)

2 dummys definieren und ein at wie im Beispiel definieren fertig.

Bei mir habe ich das für insgesamt 4 WlanDevices gemacht und zu meiner eigenen Überraschung funktioniert es, man sollte aber darauf achten das die Aktualisierung für die verschiedenen at definitionen nicht zur gleichen Zeit ablaufen, also nicht alle mit at +*00:05:00 definieren sondern unterschiedlich. Vieleicht gibts hierfür noch Verbesserungsvorschläge von jemand der Ahnung hat.

Was mich noch ein bischen stört ist der zweite dummy der ja für das setzen der $LanID missbraucht wird if($TestUser =~ m/$FBLandevice/){fhem "set $WlanNrdummy $lanDev";}
ich hatte dann sowas versucht wie if($TestUser =~ m/$FBLandevice/){$LanID = $lanDev} aber erfolglos, da gibts doch bestimmt was ?


Den seperaten HomeStatus hab ich bei dieser Variante rausgenommen (brauchte ich nicht) kann man aber einfach wieder einfügen, und die abzufragenden Devices hab ich nur bis 20 gemacht.

Also wer möchte :

Den folgenden Code in eine vorhandene 99_MyUtils.pm kopieren oder eine neue wie hier beschrieben erstellen.

###############################FB Wlan/LAN Device Status###################################################################
#
# define nameofWlanstat dummy
# define nameofWlanDevNr dummy
# define MyWlanStatus at +*00:05:00 { fbwlanstat('nameofFBLandevice','nameofWlanstatdummy','nameofWlanDevNrdummy') }
# Beispiel:
# define WLAN_Status dummy
# define Smartphone1 dummy
# define MyWlanStatus at +*00:05:00 { fbwlanstat('PC-192-168-178-44','WLAN_Status','Smartphone1') }
#
sub
fbwlanstat
{
 
  my $FBLandevice = $_[0];
  my $Wlandummy = $_[1];
  my $WlanNrdummy = $_[2];
  my @Devicelist=("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20");
  my $UserLanID="";
  my $StatusLanID="";
  my $TestUser="";
  my $LanID = Value("$WlanNrdummy");
  $UserLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$LanID/name);
  $StatusLanID=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$LanID/active);
  $StatusLanID=$StatusLanID * 1;
  if ($UserLanID =~ m/$FBLandevice/) {
    if ($StatusLanID == 1) {
      if (Value("$Wlandummy") ne "1") {
            fhem "set $Wlandummy 1";
      }
    }
    else {
      if (Value("$Wlandummy") ne "0") {
      fhem "set $Wlandummy 0";
      }
    };

  }
  else {
    foreach my $lanDev (@Devicelist){
      $TestUser=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$lanDev/name);
      print $TestUser;
      if($TestUser =~ m/$FBLandevice/){
        fhem "set $WlanNrdummy $lanDev";
      }
    }
  }; 
  } 

########## Ende



Am Montag, 28. Mai 2012 12:04:10 UTC+2 schrieb AnonymousHolger:

tobias.faust

unread,
Jul 1, 2012, 7:10:56 AM7/1/12
to fhem-...@googlegroups.com
leider funktioniert das Ganze leider nur wenn FHEM auf der Fritze läuft .. :(

Csaba

unread,
Jul 2, 2012, 3:33:34 AM7/2/12
to FHEM users
Hi

Doch es funktioniert auch wenn fhem auf einer anderen Maschine lauft.
Naturlich ist ein FritzBox doch benotigt und zwar eine gefreez-te.
Siehe:
http://groups.google.com/group/fhem-users/browse_thread/thread/4565b9b2fd082985/2f9f52563be3a27c?lnk=gst&q=csaba#2f9f52563be3a27c


Gruss,

Csaba

Sebastian

unread,
Jul 18, 2012, 1:55:06 PM7/18/12
to fhem-...@googlegroups.com
Hey,

das ist meine Lösung um zu gucken, ob ein Gerät im Netzwerk ist. Da ich immer das Problem habe, das wenn ein neues Gerät ins Netzwerk kommt sich die landevice[Nummer] ändert. Da mein Gerätename aber immer gleich bleibt, wird danach erst gesucht und somit die Nummer festgestellt und anschließend der Status festgestellt.

 
define Mustermann dummy
attr Mustermann room Muster

define WLAN notify WLAN {\
  my $net_device1="Sony-Xperia-S";;\
  $net_device1 = $net_device1."\n";;\
  my $number=0;;\
  my $net_device="";;\
  while($number <= 15){\
$net_device=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$number/name);;\
    if($net_device eq $net_device1){\
     my $status=0;;\
$status=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$number/active);;\
     fhem "set Mustermann $status";;\
     last;;\
    }\
    $number++;;\
 }\
}

define TEST at +*00:05:00 trigger WLAN_TEST

UliM

unread,
Jul 18, 2012, 2:12:20 PM7/18/12
to fhem-...@googlegroups.com
Cool :)
Aktualisierst. Du das Wiki?

Sebastian

unread,
Jul 18, 2012, 2:25:06 PM7/18/12
to fhem-...@googlegroups.com
define Mustermann dummy
attr Mustermann room Muster

define WLAN notify WLAN {\
  my $net_device1="Sony-Xperia-S";;\
  $net_device1 = $net_device1."\n";;\
  my $number=0;;\
  my $net_device="";;\
  while($number <= 15){\
$net_device=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$number/name);;\
    if($net_device eq $net_device1){\
     my $status=0;;\
 $status=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$number/active);;\
     fhem "set Mustermann $status";;\
     last;;\
    }\
    $number++;;\
 }\
}

define search_for_Mustermann at +*00:05:00 trigger WLAN

So, jetzt ist es fehlerfrei ;)

Wie registriert man sich denn im Wiki ?

Lg 

jorge

unread,
Jul 19, 2012, 1:38:49 PM7/19/12
to fhem-...@googlegroups.com
Hab das Script leicht verändert ins Wiki eingetragen

LG

dudler

unread,
Jul 19, 2012, 3:48:19 PM7/19/12
to fhem-...@googlegroups.com

Is there a delay in the publication? I can´t see it yet. Or post a link please.

{HT}


Op donderdag 19 juli 2012 19:38:49 UTC+2 schreef jorge het volgende:

jorge

unread,
Jul 19, 2012, 4:17:32 PM7/19/12
to fhem-...@googlegroups.com

Sebastian

unread,
Jul 19, 2012, 5:11:54 PM7/19/12
to fhem-...@googlegroups.com
Wunderbar :)
Danke

Lg
Message has been deleted

Sebastian

unread,
Jul 19, 2012, 8:26:53 PM7/19/12
to fhem-...@googlegroups.com
So, habe alles nochmal verbessert und verändert, bitte im Wiki nachbesser, wäre nett :)

sub
FBWlanStat($$)
{
my ($net_device1)=@_[0];
$net_device1 = $net_device1."\n";
my $number=0;
my $status=0;
my $net_device="";
my $attendance="";
while($number <= 15){$net_device=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$number/name);
    if($net_device eq $net_device1){
    $status=qx(/usr/bin/ctlmgr_ctl r landevice settings/landevice$number/active);
    last;}$number++;}
        if ($status == 1) {$attendance="Anwesend";}else{$attendance="Abwesend";}
        if(Value("@_[1]") ne $attendance){
        fhem "set @_[1] $attendance"}}


{FBWlanStat("MyWLANDeviceName", "MyDummyName")} 

Status wird jetzt auch gesetzt, wenn das Gerät nicht im Netzwerk existiert und man kann nun auch seine Dummys angeben, die man nutzt, falls man mehrere Geräte hat, so ist man unabhängiger...
      Habe zudem noch ein If eingesetzt, damit wenn der Status gleich bleibt, er nicht alle 5 min in den Log schreibt und nur dann denn Status logged, wenn der Status sich geändert hat... 

jorge

unread,
Jul 20, 2012, 5:55:47 AM7/20/12
to fhem-...@googlegroups.com
Done. Solltest Dich bei Deinen Ideen unbedingt selber im Wiki registrieren und diese (auch) dort mit anderen teilen...

Sebastian

unread,
Jul 20, 2012, 8:35:54 AM7/20/12
to fhem-...@googlegroups.com
Danke :)

Würde ich machen, wenn ich wüsste, wie man sich dort registriert xD

Lg

dudler

unread,
Jul 20, 2012, 1:17:03 PM7/20/12
to fhem-...@googlegroups.com
Hallo leute

When I use the example FHEM complains with
'
2012.07.20 18:39:32 3: Unknown attribute setList, choose one of room group comment alias eventMap disable:0,1 skip_next:0,1 loglevel:0,1,2,3,4,5,6 alignTime icon webCmd or use attr global userattr setList

on the line
attr MyAttendance setList Anwesend Abwesend

The problem seems to be the "Anwesend Abwesend". I have an international FB7390 in English. Is this an internationalization isssue?
"Present Absent" also doesn't work. "on off" does.

{HT}



Op vrijdag 20 juli 2012 14:35:54 UTC+2 schreef Sebastian het volgende:

UliM

unread,
Jul 21, 2012, 6:32:28 AM7/21/12
to fhem-...@googlegroups.com


Am Freitag, 20. Juli 2012 14:35:54 UTC+2 schrieb Sebastian:
wenn ich wüsste, wie man sich dort registriert xD

siehe http://fhemwiki.de/wiki/FHEM
oben rechts 'news': 30.06.2011: If you want an account, please contact the admins

Denn mal los :)

Gruß, Uli
Reply all
Reply to author
Forward
0 new messages