set befehl in PRESENCE function

Begonnen von nccfast, 22 Oktober 2020, 14:47:39

Vorheriges Thema - Nächstes Thema

nccfast

Hallo,
ich benutze PRESENCE um Anwesenheit eines Gerätes in meinem Netzwerk zu prüfen.

Dazu definiere ich:


define pc_jonas PRESENCE function {KB_macping("1c:1b:0d:ec:1f:85", "pc_jonas")} 60 60


und


define pc_jonas_mac dummy
define pc_jonas_ip dummy


Die Funktion KB_macping prüft die MAC Adresse und liefert die zugehörige IP zurück (durch externes Shell Script), die ich gerne setzen würde in den dummy variablen mit fhem("set ".$NAME."_ip ".$IP);.


sub
KB_macping
{
 
  my ($MAC,$NAME) = @_;
  my $ret = 0;
  my $fctname = 'KB_macping';
 
  my $IP =  `/mnt/2/Daten/fhem/scripts/vmacping.sh $MAC`;
 
  Log3 $fctname, 3, "IP: ".$IP;
 
  fhem("set ".$NAME."_mac ".$MAC);
  fhem("set ".$NAME."_ip ".$IP);

  if ($IP ne '0')
  {
    $ret = 1;
  } 
 
  #Log3 $fctname, 3, "ret ".$ret;
  return $ret;
}


Leider wird die IP und die MAC in den dummy Variablen nicht gesetzt.

Rufe ich oben in fhem "{KB_macping("1c:1b:0d:ec:1f:85", "pc_jonas")}" auf, wird es aber gesetzt.

Woran kann das liegen?

MadMax-FHEM

#1
Zitat von: nccfast am 22 Oktober 2020, 14:47:39
Woran kann das liegen?

Hmm, an so einigem...

Also:

Zitat
my $IP =  `/mnt/2/Daten/fhem/scripts/vmacping.sh $MAC`;

Liefert das keinen Fehler im fhem Log?

Zumindest würde ich meinen es müsste so:


my $IP =  qx("/mnt/2/Daten/fhem/scripts/vmacping.sh $MAC");

Aber: der qx-Aufruf blockiert!
Also fhem "steht" solange...
(vermutlich geht es schnell? Wollte es nur angemerkt haben)

1. was soll 'irgendwas' tun? (also "Irgendwas" in einfachen Anführungszeichen) Soweit ich weiß gehen Systemaufrufe in fhem so: "SystemAufruf" / Aber du bist ja "in" Perl, daher müsste das so: fhem("\"SystemAufruf"\"). Aber das liefert keine Werte zurück (soweit ich weiß). Dann gibt es noch system("Systemaufruf") oder eben qx("Systemaufruf")

2. die einfachen Ausführungszeichen "verhindern", dass die Variable $MAC "aufgelöst" wird, es wird also nicht der Inhalt (die MAC-Adresse) übergeben, sondern $MAC also die Zeichenfolge $MAC ;)

Dann brauchst du keine 2 dummy, einer reicht (wofür sind die eigentlich?):

statt 2x set dummy $IP bzw. $MAC evtl. nur einen dummy und dann einfach:

fhem("setreading $NAME MAC $MAC");
fhem("setreading $NAME IP $IP");

Allerdings wäre ich mit NAME als Variablenname vorsichtig, den gibt es so auch in notify etc.
Kein Problem in dem Sinne, da ja eingeschränkte Gültigkeiten, wollte es nur anmerken (bzw. nehme ich dann lieber Name)...

EDIT: auch weiß ich ja nicht wie du Anwesenheit feststellst... Weil der PC ist ja auch anwesend, wenn die aufgerufene Funktion/Script "Schrott" zurück liefert:   if ($IP ne '0')

EDIT: reicht kein "normaler" LAN-ping Presence?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Hi,

weiß nicht woran es liegt - aber es klingt mir umständlich. Warum muss es die MAC sein? Wie löst Du im Shellscript die MAC auf? Warum extra dummy?
Darf ich eine andere Lösung vorstellen?
defmod SMBomv1 PRESENCE function {ServiceMonitor("omv1","445")}
in der 99_myUtils:
sub ServiceMonitor($$)
# Usage: ServiceMonitor("Hostname","Portnummer")
# in Presence: function {ServiceMonitor("Hostname","Portnummer")}
{
    use Net::Ping;
    my ($host, $port)    = @_;
    my $status;
   
    # Create a new ping object
    my $p = Net::Ping->new("syn");
    $p->port_number($port);
    $p->ping($host,10);
   
    # perform the ping
    if ( $p->ack ) {
$status = 1;
    }
    else{
    $status = 0;
    }
   
    # close our ping handle
    $p->close();
    return $status;
   
}

ja blockiert auch! Aber hatte bisher kein Problem damit.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

nccfast

Ich mache das so, weil ich gerne anhand der MAC Adresse feststellen möchte, ob das Gerät pingbar ist. Es kann sein, dass sich die IP des Gerätes oder der Name des Gerätes ändert.

Das Script vmacping.sh sieht so aus:

#!/bin/bash
network=192.168.0.1/24
if [ "$#" -ne 1 ]; then echo Usage example: $0 aa:bb:cc:dd:ee:ff; exit 2; fi;

# extract ip from local arp table
ip=$(arp -n | grep $1 | awk ' { print $1 }')

# not found an ip tied to the mac address?
if [ -z $ip ]; then

    # echo "Not found into local arp table. Trying another way..."
    nmap -sP -T4 $network >& /dev/null
    # wanna try your nmap strategy?
    # sudo nmap -sP 192.168.15.1/24 | grep  20:64:32:3F:B1:A9
fi;

ping $ip -n -q -c 2 -i 0.2 -w 1 >& /dev/null
if [ $? -eq 0 ]; then
    printf $ip;
else
    printf  "0";
fi;




Die dummys deswegen, weil ich die IP im einem zugehörigen Notify Script brauche, um auf dem Gerät unter gewisen Umständen (Dauer der Anwesenheit überschritten) per ssh einen Befehl auszuführen, z.B. einen Hinweis aufpoppen zu lassen oder das gerät runterfahren.


MadMax-FHEM

Aha: (ständig) ändernde IPs!? Warum? (naja eigentlich [mir] egal, ist ja nicht mein Netzwerk ;)  )

Und auch die notify etc. gehen unter Einsparung eines dummy (also Verwendung nur eines) wie ich vorgeschlagen hatte...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

nccfast

ständig ändernd deswegen, weil es eine Überwachung des pc meines Sohnes ist, und wenn er mal verstanden hat, dass man einfach die IP ändern könnte,  .....
ich weiss, mann könnte auch die mac ändern ...

Entscheidend ist aber, warum der Befehl "fhem("set ".$NAME."_ip ".$IP); " nicht funktioniert, wenn die Funktion aus dem PRESENCE heraus aufgerufen wird. Denn wenn ich die Funktion in der FHEM Oberfläche oben eingebe, funktioniert das alles.

MadMax-FHEM

#6
Schau dir doch mal meine Variante an ;)
EDIT: die braucht das "Zusammensetzen" gar nicht, weil es nur einen dummy gibt, dort aber dafür 2 "fixe" Readings :)

Und evtl. ist $NAME. falsch, versuch doch mal ein Leerzeichen zwischen den Punkten!

Also: $NAME . "wasanderes"

Oder vorher in eine Variable "schreiben" (evtl. gehen an der Stelle keine Perl-Punkte ;)  )...

EDIT: weil EXAKT DAS in der fhem-Web-Zeile bestimmt NICHT geht! Weil es dort schon mal $NAME und auch $IP nicht geben dürfte!? ;)

EDIT: evtl. empfiehlt sich zu "debug-Zwecken" auch Logausgaben zu machen (und dann ist es auch von Vorteil den Befehl als solches loggen zu können oder zumindest Teile davon, wie z.B. den "fertigen Namen" ;) )...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Na da kannst Du ja froh sein, dass Dein Sohn kein Gerät mit integriertem MAC Spoofing hat (IOS) :)
Aber egal, warum brauchst Du den Dummy? Warum ist es nicht das Presence Device an sich? Das kann doch alles?
Und nimm nicht $NAME (wie Joachim schon sagt) nimm $SOHN oder sowas ;) aber vielleicht ist es nicht das Problem.

Gruß Otto

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

nccfast

Habe auch schon folgendes in der Funktion versucht:
fhem("set pc_jonas_ip Hallo");
also an $NAME oder einem Punkt liegt es nicht

Wenn ich folgendes oben in FHEM eingebe, geht ja alles:
{KB_macping("1c:1b:0d:ec:1f:85", "pc_jonas")}

Aber noch was zum Vorgehen:
Ich habe dann auch noch definiert

define NTF_pc_jonas notify pc_jonas:presence:.* { fhem KB_process_presence($NAME, $EVENT, 'konrad') }


Das mache ich deshalb, weil ich die Ein-/Ausschaltzeiten in der DB logge.
Die Funktion "KB_process_presence" wertet dann die DB einträge aus und errechnet die tägliche online Zeit und sendet dann ggf. an den rechner per ssh eine msg zum ausschalten. Und dazu brauch ich die IP in der dummy Variablen, denn im Prinzip weiß ich die IP ja erst, nachdem ich KB_macping gemacht habe.

Übrigens: In der Funktion "KB_process_presence" funktionieren die fhem set Befehle, also z.B. fhem("set pc_jonas_ip Hallo");

Und zum Logging:
Ich habe die fhem.pl bis zu "setReadingsVal" geloggt. Es fallen keine Unterschiede auf und es sieht auch so aus, als dass der Wert gesetzt wird. Habe dazu
$hash->{READINGS}{$rname}{VAL} = $val;
ausgegeben im LOG file.
Selbst $hash (Adress Wert) stimmt überein mit Test-Situation, bei denen das setzen funktioniert.

Trotzdem wird der Wert nicht gesetzt.

Entscheidend ist deshalb immer noch, warum der Befehl "fhem("set ".$NAME."_ip ".$IP);" oder meinetwegen auch "fhem("set pc_jonas_ip Hallo");" nicht funktioniert, wenn die Funktion aus dem PRESENCE heraus aufgerufen wird. Wenn ich die Funktion in der FHEM Oberfläche oben eingebe, funktioniert aber alles.




MadMax-FHEM

Leichter als zu erläutern was du so eingebaut hast (zu Testzwecken) ist ein neuer Post der aktuellen sub ;)

Wenn ich nachher mal Zeit habe baue ich das Versuchsweise mal nach...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

nccfast

hier vereinfacht und ohne den Sinn zu hinterfragen:

Ich habe ein PRESENCE device und ein dummy:

define pc_test PRESENCE function {KB_test()} 10 10
attr pc_test room Kindersicherung

define pc_test_ip dummy
attr pc_test_ip room Kindersicherung


Und dann habe ich die bei PRESENCE verwendete function (vereinfacht):

sub
KB_test
{
  my $ret = 0;
  my $fctname = 'KB_test';
 
 
  fhem("set pc_test_ip Hallo");

  $ret = 1;
 
  Log3 $fctname, 3, "ret ".$ret;
  return $ret;
}



Wenn ich oben in FHEM Oberfläche eingebe {KB_test()}, geht es, dass pc_test_ip gesetzt wird.

Wenn PRESENCE anschlägt (alle 10 Sekunden), geht es nicht, dass pc_test_ip gesetzt wird.



MadMax-FHEM

#11
Also ich habe das jetzt mal nachgespielt...

Und: ich konnte auch keine fhem-Befehle innerhalb der von PRESENCE aufgerufenen Sub ausführen...  :-[

Egal wie ich es gemacht habe...

Da muss wohl in PRESENCE die Sub "eigenartig" aufgerufen werden...
Evtl. per non-Blocking im Hintergrund!?
(da glaube ich gingen fhem-Befehle bzw. set/setreadings nicht!?)

EDIT: gerade im Code nachgesehen -> BlockingCall, daher wird das mit dem setzen von Werten nicht gehen! ABER: du könntest es z.B. per Telnet oder http-Request oder oder aus dem Shellscript aufrufen... Dann also auch den/die Namen der dummy übergeben. Trotzdem nochmal ( ;)  ) ich würde dann wenigstens auf einen dummy gehen und setreading nutzen... Aber: dein System ;)

EDIT: auch bzgl. des Script aufrufes habe ich mal probiert. Wenn du einen Rückgabewert willst, dann geht das so   my $IP =  qx(/opt/fhem/vmacping.sh $MAC);

EDIT: weitere Alternative (zum Setzen der Werte AUS dem Script heraus) wäre selber z.B. at anzulegen und dann (da ja eh ein [oder 2 dummy]) "da ist") auch den Presence-Zustand selbst zu machen... Und da vielleicht mal den Befehl setreading (statt nur set) anzuschauen...

EDIT: das wäre dann per at

sub KB_macping($$)
{
  my ($MAC,$Name) = @_;
  my $ret = 0;
 
  Log3(undef, 3, "KB_macping  MAC: $MAC    Name: $Name");

  my $IP =  qx(/opt/fhem/vmacping.sh $MAC);

  fhem("setreading $Name IP $IP; setreading $Name MAC $MAC");

  if ($IP ne '0')
  {
    fhem("setreading $Name state present");
    fhem("setreading $Name presence present");
  }
  else
  {
    fhem("setreading $Name state absent");
    fhem("setreading $Name presence absent");
  }
}


Ja, leider kein PRESENCE Device dann...
Der dummy würde dann so aussehen.
Die gelieferten Events sind sowohl für Presence-Notiy als auch für deine "speziellen" Notify nutzbar...

Internals:
   CFGFN     
   FUUID      5f92aab9-f33f-19f1-5294-a5ef020c675c5ce6
   NAME       pc_jonas
   NR         1154
   STATE      present
   TYPE       dummy
   READINGS:
     2020-10-23 12:04:54   IP              192.168.1.1
     2020-10-23 12:04:54   MAC             1c:1b:0d:ec:1f:85
     2020-10-23 12:04:54   state           present
Attributes:
   room       Test



defmod atPCJonas at +*00:00:30 {KB_macping("1c:1b:0d:ec:1f:85", "pc_jonas")}


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

nccfast

Vielen Dank, MadMax-FHEM. Das erklärt es.

Zitathttp-Request oder oder aus dem Shellscript aufrufen
wie würde das ausschauen?

ZitatWenn du einen Rückgabewert willst, dann geht das so   my $IP =  qx(/opt/fhem/vmacping.sh $MAC);
So wie ich es verstanden habe, hast du recht. Aber mit Backticks geht es ebenso.

ZitatTrotzdem nochmal ( ;)  ) ich würde dann wenigstens auf einen dummy gehen und setreading nutzen... Aber: dein System
Wenn ich nur einen dummy nehme, muss ich in der "process" funktion diesen einen dummy wieder parsen nach der IP. Was ist so schlimm an zwei dummies?

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MadMax-FHEM

#14
Zitat von: nccfast am 23 Oktober 2020, 12:06:32
Wenn ich nur einen dummy nehme, muss ich in der "process" funktion diesen einen dummy wieder parsen nach der IP. Was ist so schlimm an zwei dummies?

Schlimm an 2 dummy ist gar nichts außer: ein unnötiges, zusätzliches Device... Übersicht... Du könntest mittels setreading sogar das bereits vorhandene PRESENCE-Device nehmen und ganz auf dummy verzichten... ;)

Viel Erfolg, Joachim

P.S.: meine "at-Alternative" hast du gesehen? ;) Evtl. einfacher, wenn du keine "speziellen" Dinge von PRESENCE brauchst... Aber mittels Script etc. geht nat. auch...
EDIT: nicht "zwingend" wegen der "at-Lösung" sondern eher/auch wegen der setreading-Aufrufe und wie dann der dummy (oder auch das PRESENCE-Devices) aussehen könnte/würde... ;)
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)