[Gelöst] Perl-Frage: Korrektes Gerät anhand eines User-Attributes finden

Begonnen von LordVoodoo, 21 Mai 2018, 19:35:46

Vorheriges Thema - Nächstes Thema

LordVoodoo

Hallo zusammen,

ich möchte gern die Fritz Box für Presence nutzen und nebenbei auch die Anbindung mit auslesen, insbesondere die Stärke der WLAN-Verbindung.

Im Moment scheitert es noch am Auffinden des DUMMY-Gerätes.

Ich habe ein userattr namens "mac_address" gesetzt und möchte daran ein Gerät auch wiederfinden. Mein Ansatz war:


  ...
  my @devicearray = defInfo('mac_address=$mac','NAME');
  my $numofelements = @devicearray;

  if ($numofelements eq 0 and $mac ne "")
  {  $device = Network_Device_$mac;
     fhem("define $device dummy");
     fhem("attr $device userattr mac_address");
     fhem("attr $device mac_address $mac");
  }

  if ($numofelements eq 1 and $mac ne "")
  {  $device = @devicearray[0]; }
  ...


Die Variable $mac enthält die Mac-Adresse gemäß Fritz Box. Erwartungshaltung ist, dass mir "defInfo('mac_address=$mac','NAME');" exakt einen Gerätenamen zurückliefert und zwar den mit "mac_address=$mac".
Falls das Array leer ist, wird ein generisches Element angelegt.

Am Ende steht in der Variable $device der Gerätename des Zielgerätes.

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

LordVoodoo

Vielen Dank, nach einigem Probieren funktioniert das Code-Fragment. Nun habe ich ein Notify, welches mir die Fritz-Box-Werte in einzelne Dummy-Elemente schreibt:


Netzwerk_Router:mac_([ABCDEF0-9_]*):.* {
  my $device = "none";
  my $router = $EVENT;
  my $sleep_id_absent = $EVTPART0."sleepAbsent";
  my $timer = InternalVal($NAME,"INTERVAL","300") + 10;
  my $mac;
  my $devicename;
  my $connectiontype;
  my $wlan50;
  my $wlan24;
  my $rssi;
  my $lan;

  # Extract the information for Wifi connection
  if ($EVENT =~ m /^mac_([ABCDEF0-9_]*): ([A-Za-z0123456789-]*) \((WLAN), ([0-9]*) \/ ([0-9]*) Mbit\/s, ([-0-9]*)\)/)
  {
    $mac = $1;
    $devicename = $2;
    $connectiontype = $3;
    $wlan50 = $4;
    $wlan24 = $5;
    $rssi = $6;
  }

  # Extract the information for Wifi connection
  if ($EVENT =~ m /^mac_([ABCDEF0-9_]*): ([A-Za-z0123456789-]*) \((LAN).*, ([0-9]*) Mbit\/s\)/)
  {
    $mac = $1;
    $devicename = $2;
    $connectiontype = $3;
    $lan = $4;
  }

  my $devspec = "mac_address=".$mac;
  foreach my $dev (devspec2array($devspec)) {
    $device = $dev;
  }

  if ( $device eq "none")
  {  $device = "Network_Device_".$mac;
     fhem("define $device dummy");
     fhem("attr $device userattr mac_address");
     fhem("attr $device mac_address $mac");   
     fhem("attr $device group Netzwerk");
     fhem("attr $device stateFormat presence");
     fhem("attr $device event-on-change-reading .*");
  }

  if ($device ne "none")
  {
     fhem("setreading $device mac $mac");
     fhem("setreading $device devicename $devicename");
     fhem("setreading $device connection $connectiontype");
     fhem("setreading $device wlan50 $wlan50");
     fhem("setreading $device wlan24 $wlan24");
     fhem("setreading $device rssi $rssi");
     fhem("setreading $device presence present");
     fhem("setreading $device lan $lan");

     # Cancel existing sleep command and create it with 310 seconds
     fhem("cancel $sleep_id_absent quiet");
     fhem("sleep $timer $sleep_id_absent quiet;setreading $device presence absent");
  }
}