Abfrage aktiver Netzwerkgeräte

Begonnen von Mundus, 31 Oktober 2016, 20:25:20

Vorheriges Thema - Nächstes Thema

CoolTux

Zitat von: Mundus am 28 November 2016, 23:29:57
Guten Abend,

das Problem ist gelöst. Ich hatte in der Funktion createValues_done die Zeile
delete($hash->{helper}{RUNNING_PID});
vergessen. Vielen Dank für eure Hilfe, die Anmerkungen haben mich zum Ziel gebracht.

Das ganze Produkt sieht jetzt so aus.
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;
use strict;
use warnings;
use POSIX;
use Blocking;

sub getValue($$);
sub createValues_done ($);
sub deleteDummyValues ($);
sub createValues_Aborted ($);
#########################

sub
FritzWLANUtils_Initialize($$)
{
  my ($hash) = @_;
}

###############################################
sub FBLANValues()
{
my ($hash) = @_;
my $DevNameFB = "JuFaFritzBox";
$hash = $defs{$DevNameFB};

BlockingKill($hash->{helper}{RUNNING_PID}) if(defined($hash->{helper}{RUNNING_PID}));

##Aufruf des Blocking Call CreateValues
Log3 $DevNameFB, 4 , "Aufruf Create Values wird gestartet. Der Hash lautet $hash";

$hash->{helper}{RUNNING_PID} = BlockingCall("CreateValues","$DevNameFB","createValues_done",30,"createValues_Aborted",$DevNameFB) unless(exists($hash->{helper}{RUNNING_PID}));

}


sub CreateValues ($)
{

  my ($DevNameFB) = @_;
  my $n = "";
  my $AnzahlDev = getValue(fhem("get $DevNameFB tr064Command Hosts:1 hosts GetHostNumberOfEntries"),"'NewHostNumberOfEntries' => '");
  my $ReadingName;
  my $TextReading;
  my $returnValue = $DevNameFB;
  my $wLanNr = 0;
  my $LanNr = 0;
########Debug######################
Log3 $DevNameFB, 4 , "BlockingCall wird ausgeführt, der returnValue lautet $returnValue";
############ Auslesen der aktiven wLan-  bzw Lan-Geräte
foreach $n (0..$AnzahlDev -1) {
   
   my $AktivLan = fhem("get $DevNameFB tr064Command Hosts:1 hosts GetGenericHostEntry 'NewIndex' '$n'");
   
   if (getValue($AktivLan,"'NewActive' => '") == 1) {
         if (getValue($AktivLan,"'NewInterfaceType' => '")eq "802.11") {
            $ReadingName = $wLanNr + 1;
$ReadingName = "WLan".$ReadingName;
$TextReading = getValue($AktivLan,"'NewHostName' => '") .':' .getValue($AktivLan,"'NewIPAddress' => '");
$returnValue .="|$ReadingName,$TextReading";
$wLanNr++
}

         elsif (getValue($AktivLan,"'NewInterfaceType' => '")eq "Ethernet") {
            $ReadingName = $LanNr + 1;
$ReadingName = "Lan".$ReadingName;
$TextReading = getValue($AktivLan,"'NewHostName' => '") .':' .getValue($AktivLan,"'NewIPAddress' => '");
$returnValue .="|$ReadingName,$TextReading";
$LanNr++;
}
}
};   

#######Anzahl Aktiver WLan-Geräte deaktivieren
$returnValue .="|AktiveWLanGeraete,$wLanNr";
#######Anzahl Aktiver LAN-Geräte
$returnValue .="|AktiveLanGeraete,$LanNr";
#######Neue Nachrichten auf AB
$TextReading = ReadingsVal($DevNameFB,'tam1_newMsg',"");
$returnValue .="|NeueNachrichtenAB,$TextReading";
#######FritzBox-Temp
$TextReading = ReadingsVal($DevNameFB,'box_cpuTemp',"");
$returnValue .="|FritzCPUTemp,$TextReading";

##################Debug#############################
Log3 $DevNameFB, 4, "NonBlocking Sub abgearbeitet -> Werte $returnValue";
####################################################

return $returnValue;
}
########################################
####
#Funktion zum Speichern der Werte
sub createValues_done ($){

my ($valueString) = @_;
#############Debug#############################
Log3 "JuFaFritzBox", 4, "createValues_done wird ausgeführt und hat den Wert $valueString übergeben bekommen";
####VALUE-String in einzelne Elemente zerlegen !muss generisch sein, da Anzahl LAN und WLAN vorher nicht bekannt ist
my (@Values) = split("\\|",$valueString);
my $name = $Values[0];
my $hash = $defs{$name};
my $readingName;
my $textReading;
my $nameDummy = 'dFritzLan';

#############Debug und löschen des $hash########
Log3 "JuFaFritzBox", 4, "createValues_done löscht jetzt den aktiven $hash";
delete($hash->{helper}{RUNNING_PID});
####################

####Löschen des ersten Elementes im Array####
shift(@Values);
#Löschen der alten Values im Dummy
deleteDummyValues($nameDummy);

#Nunmehr erfolgt das erneute Beschreiben des Dummys
foreach (@Values) {
($readingName,$textReading) = split (",",$_);
fhem("setreading $nameDummy $readingName $textReading");
}
}
########################################
####
# Funktion zum Löschen der Dummy-Werte der FritzBoxParameter
#
sub deleteDummyValues($) {
    my ($nameDummy) = @_;
    my $n;
my $Anzahl = ReadingsVal($nameDummy,'AktiveWLanGeraete',"");
foreach $n (1..$Anzahl){
fhem("deletereading $nameDummy WLan$n")
}

$Anzahl = ReadingsVal($nameDummy,'AktiveLanGeraete',"");
foreach $n (1..$Anzahl){
fhem("deletereading $nameDummy Lan$n")
}
}

####
# Funktion zum Auslesen der FritzBoxParameter
#
sub getValue($$) {
     my ($resp_FB, $searchstr) = @_;

     my $PosStart = index($resp_FB,$searchstr) + length($searchstr);
     my $AnzChar = index($resp_FB,"'",$PosStart) - $PosStart;
     my $Value = substr ($resp_FB,$PosStart,$AnzChar);

     return $Value;
}
#####################################
### Abbruch Funktion
sub createValues_Aborted($) {

    my ($hash) = @_;
    my $name = $hash->{NAME};

    delete($hash->{helper}{RUNNING_PID});
    Log3 $name, 4, "($name) - The BlockingCall Process terminated unexpectedly. Timeout";

}


##########Ende#######################
1;

Wenn ihr aber noch Verbesserungen findet, dann teilt mir diese bitte mit, da ich davon super lernen kann.
Wie mache ich das? Ist hierbei Log3 der richtige Weg -so habe ich es gemacht- oder gibt es ein anderen Weg bzw. ein Tool.
Wie kann ich mit nmap herausfinden, ob die Geräte via WLAN oder LAN angebunden sind. Meine Recherche hat nichts erbracht?

Du kannst Log3 oder Log1 nehmen. Das sind Subs von FHEM. Oder Du nimmst einfach das gute alte Perl printf  ;D
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

justme1968

mit dem nmap modul kannst du nicht nach lan/waln unterscheiden.

aber darum ging es ja zumindest laut titel des thread auch noch nicht :)
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968