FHEM Forum

FHEM => Sonstiges => Thema gestartet von: LordVoodoo am 21 Mai 2018, 19:35:46

Titel: [Gelöst] Perl-Frage: Korrektes Gerät anhand eines User-Attributes finden
Beitrag von: LordVoodoo am 21 Mai 2018, 19:35:46
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.
Titel: Antw:Perl-Frage: Korrektes Gerät anhand eines User-Attributes finden
Beitrag von: CoolTux am 21 Mai 2018, 20:05:48
Schau Dir mal devspec2array an
Titel: Antw:Perl-Frage: Korrektes Gerät anhand eines User-Attributes finden
Beitrag von: LordVoodoo am 21 Mai 2018, 22:59:10
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");
  }
}