PRESENCE: 2 Vorschläge/Wünsche: konfigurierbarer Ping-Count und Modus "shellscript"

Begonnen von Uli Zappe, 30 März 2013, 05:55:52

Vorheriges Thema - Nächstes Thema

justme1968

hallo markus,

das schaut klasse aus. mein anwesenheitscheck per smnp auf meine airport basestation funktioniert wunderbar. code unten falls es noch jemand brauchen kann. anlegen mit ip der basis station und mac des telefons als hex zahl:define iPhoneAndre PRESENCE function {snmpCheck("10.0.1.1","0x44d77429f35c")} 30 30
nur zwei dinge sind mit aufgefallen:
- wenn ich das check intervall weg lasse bekomme ich den fehler: check-interval must be a number
- es wird bei jedem check noch was ins log geschrieben. ich vermute mal das ist noch absicht.

gruss
  andre

sub
snmpCheck($$)
{
  my ($airport,$client)= @_;
 
  my $community = "public";
  my $host = $airport;
  my $oid = ".1.3.6.1.2.1.3.1.1.2";
  #my $oid = ".1.3.6.1.2.1.3.1.1.2.25.1.10.0.1";
 
  my ( $session, $error ) = Net::SNMP->session(
           -hostname  => $host,
           -community => $community,
           -port      => 161,
           -version   => 1
  );
 
  if( !defined($session) ) {
    return 0;
    return "Can't connect to host $host.";
  }
 
  my @snmpoids = ();
 
  my $response = $session->get_next_request($oid);
  my @nextid   = keys %$response;
  while ( $nextid[0] =~ m/^$oid/ ) {
    push( @snmpoids, $nextid[0] );
 
    $response = $session->get_next_request( $nextid[0] );
    @nextid   = keys %$response;
  }
 
  if( !defined($response = $session->get_request( @snmpoids ) ) ) {
    return 0;
  }
 
 
  foreach my $value (values %$response) {
    return 1 if( $value eq $client )
  }
 
  return 0;
}
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Markus Bloch

Zitat von: justme1968 schrieb am Sa, 13 April 2013 11:14nur zwei dinge sind mit aufgefallen:
- wenn ich das check intervall weg lasse bekomme ich den fehler: check-interval must be a number
- es wird bei jedem check noch was ins log geschrieben. ich vermute mal das ist noch absicht.

Ist im SVN gefixet.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Uli Zappe

Hallo Markus,

Zitat von: Markus Bloch schrieb am Sa, 13 April 2013 10:20shellscript: Das Skript muss eine 0 (abwesend) oder 1 (anwesend) auf der Konsole ausgeben. Der exit-Code wird nicht ausgewertet.
Gibt es einen besonderen Grund, warum Du das so gemacht hast (also qx() statt system() genommen hast)? Die Konsole-Ausgaben verschiedener Programme sind doch sehr unterschiedlich, aber exit-Code 0 = Erfolg und !0 = Misserfolg ist in der Shell universell gültig. (D.h. es müsste stringenter Weise dann natürlich auch 0 = present und alles !0 = absent sein.)

Z.B. würde meine Bitte, den Ping-Count einstellbar zu machen, dann eigentlich überflüssig werden, da man auch einfach ping in Zusammenhang mit shellscript verwenden könnte (gibt auch 0 bei Erfolg zurück, sonst etwas anderes).

Theoretisch ließen sich Befehle, bei denen der exit-Code entscheidend ist, natürlich recht einfach an Deine jetzige PRESENCE-Version anpassen mit

befehl > dev/null; echo $?

das auch keinen allzu großen Overhead hat (obwohl bei sich ggf. schnell wiederholenden Kommandos natürlich jeder Overhead unschön ist, und im übrigen die "verlängerte" Skriptzeile natürlich unnötig kompliziert/fehlerträchtig ist).

Nur dummerweise habe ich FHEM partout nicht dazu bekommen, solch ein Shellscript zu akzeptieren; ";;", "\" etc.  alles versucht; es gibt immer irgendwelche Fehlermeldungen.

Daher konnte ich leider bislang PRESENCE mit "meinem" Befehl (der auch Exitwerte benutzt für Erfolg/Misserfolg) noch nicht ausprobieren.

Markus Bloch

Zitat von: Uli Zappe schrieb am So, 14 April 2013 23:56Gibt es einen besonderen Grund, warum Du das so gemacht hast (also qx() statt system() genommen hast)? Die Konsole-Ausgaben verschiedener Programme sind doch sehr unterschiedlich, aber exit-Code 0 = Erfolg und !0 = Misserfolg ist in der Shell universell gültig. (D.h. es müsste stringenter Weise dann natürlich auch 0 = present und alles !0 = absent sein.)

Das hat folgenden Hintergrund: Die Perl-Funktion system(), sobald sie aufgerufen wird, führt einen fork() durch, startet den Shell-Befehl und wartet mit wait() bis das Ergebnis vorliegt.

Nun ist aber das Problem, dass PRESENCE diesen Shell-Befehl bereits in einem Fork abarbeitet. Ein Fork kann nicht nochmal erneut forken um den system-call durchzuführen.

Die Funktion exec() gibt kein exit-code zurück und wartet auch nicht auf den Output. Daher hab ich keine andere Möglichkeit als qx() zu verwenden.

Wenn ich system() bei mir nutze, kommt bei jedem Befehl, egal welchem -1 zurück. Damit kann ich natürlich nichts auswerten

Tut mir leid.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Markus Bloch

Zitat von: Uli Zappe schrieb am So, 14 April 2013 23:56Theoretisch ließen sich Befehle, bei denen der exit-Code entscheidend ist, natürlich recht einfach an Deine jetzige PRESENCE-Version anpassen mit

befehl > dev/null; echo $?

das auch keinen allzu großen Overhead hat (obwohl bei sich ggf. schnell wiederholenden Kommandos natürlich jeder Overhead unschön ist, und im übrigen die "verlängerte" Skriptzeile natürlich unnötig kompliziert/fehlerträchtig ist).

Diese Lösung würde zwar auf Linux und FritzBoxen funktionieren, aber leider nicht unter Windows :-(

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Uli Zappe

Zitat von: Markus Bloch schrieb am Mo, 15 April 2013 19:21Nun ist aber das Problem, dass PRESENCE diesen Shell-Befehl bereits in einem Fork abarbeitet. Ein Fork kann nicht nochmal erneut forken um den system-call durchzuführen.
Huch! Das wusste ich nicht ... Ich habe nicht allzu viel Ahnung von Perl und in C wäre das kein Problem, daher kam mir das nicht in den Sinn. Seltsam ...

ZitatWenn ich system() bei mir nutze, kommt bei jedem Befehl, egal welchem -1 zurück. Damit kann ich natürlich nichts auswerten
In der Tat ...

ZitatTut mir leid.
Da kannst Du ja nix für - dafür müsste man die Perl-Entwickler hauen. Danke für die Erläuterung!

Zitat von: Markus Bloch schrieb am Mo, 15 April 2013 19:30Diese Lösung würde zwar auf Linux und FritzBoxen funktionieren, aber leider nicht unter Windows :-(
FHEM läuft bei mir aber gar nicht unter Windows, sondern unter Linux, und da funktioniert es eben leider auch nicht, oder ich bin jedenfalls zu blöd dazu, das Ganze so in die Definition in fhem.cfg zu schreiben, dass FHEM es ganz ausliest - es bricht immer irgendwo inmitten des Befehls mit dem Einlesen ab und gibt dann natürlich eine entsprechende Fehlermeldung über eine falsche Definition in fhem.cfg aus.

Na gut, da muss ich wohl oder übel den Sourcecode des Befehls modifizieren, den ich mit shellscript verwenden will. Ist zwar unschön, aber ich kann es ohne Source Fork machen, da ich der Autor bin.

Bei ping geht das leider nicht, so dass ich es nicht mit shellscript zusammen verwenden kann. Von daher die große Bitte an Dich, bei Gelegenheit noch den Ping-Count in PRESENCE konfigurierbar zu machen.

Markus Bloch

Zitat von: justme1968 schrieb am Sa, 13 April 2013 11:14hallo markus,

das schaut klasse aus. mein anwesenheitscheck per smnp auf meine airport basestation funktioniert wunderbar. code unten falls es noch jemand brauchen kann. anlegen mit ip der basis station und mac des telefons als hex zahl:define iPhoneAndre PRESENCE function {snmpCheck("10.0.1.1","0x44d77429f35c")} 30 30

sub
snmpCheck($$)
{
  my ($airport,$client)= @_;
 
  my $community = "public";
  my $host = $airport;
  my $oid = ".1.3.6.1.2.1.3.1.1.2";
  #my $oid = ".1.3.6.1.2.1.3.1.1.2.25.1.10.0.1";
 
  my ( $session, $error ) = Net::SNMP->session(
           -hostname  => $host,
           -community => $community,
           -port      => 161,
           -version   => 1
  );
 
  if( !defined($session) ) {
    return 0;
    return "Can't connect to host $host.";
  }
 
  my @snmpoids = ();
 
  my $response = $session->get_next_request($oid);
  my @nextid   = keys %$response;
  while ( $nextid[0] =~ m/^$oid/ ) {
    push( @snmpoids, $nextid[0] );
 
    $response = $session->get_next_request( $nextid[0] );
    @nextid   = keys %$response;
  }
 
  if( !defined($response = $session->get_request( @snmpoids ) ) ) {
    return 0;
  }
 
 
  foreach my $value (values %$response) {
    return 1 if( $value eq $client )
  }
 
  return 0;
}

Könntest du das zufällig unter http://www.fhemwiki.de/wiki/Anwesenheitserkennung im Wiki mit einpflegen?

Das währe super.

Viele grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Uli Zappe

Hallo Markus,

Zitat von: Uli Zappe schrieb am Mo, 15 April 2013 23:19Na gut, da muss ich wohl oder übel den Sourcecode des Befehls modifizieren, den ich mit shellscript verwenden will.
Das habe ich jetzt gemacht, aber leider bleibt der Status von PRESENCE grundsätzlich auf absent.

Allerdings gilt das ebenso für einen konfigurierten lan-ping, der zuvor bereits wunderbar funktionierte. Da hat sich also offenbar im jüngsten Update ein Bug eingeschlichen!?

Nachtrag:

Wobei mir gerade auffällt, dass ich seit dem letzten Update bei einem Neustart von FHEM folgende Fehlermeldungen in der Logdatei habe:

Use of uninitialized value in concatenation (.) or string at /usr/share/fhem/FHEM/Blocking.pm line 105.
2013.04.16 03:22:29 1: CallBlockingFn: Can't connect to localhost:

Can't use an undefined value as a symbol reference at /usr/share/fhem/FHEM/Blocking.pm line 116.


Vielleicht ist das ja der Grund?

justme1968

ZitatKönntest du das zufällig unter http://www.fhemwiki.de/wiki/Anwesenheitserkennung im Wiki mit einpflegen?

schau mal ob dir das so gefällt.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Uli Zappe

Zitat von: Uli Zappe schrieb am Di, 16 April 2013 01:51Da hat sich also offenbar im jüngsten Update ein Bug eingeschlichen!?
Hat sich nach erneutem Update von fhem.pl heute erledigt - jetzt geht alles! :-)

Markus Bloch

Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Uli Zappe

Hallo Markus,

wäre es denn möglich, dass Du bei Gelegenheit noch meinen zweiten Vorschlag/Wunsch implementierst (den konfigurierbaren Ping-Count)?

Da PRESENCE nicht den exit-Status, sondern die Konsole-Ausgabe auswerten kann, kann ich den einfachen Workaround, ping mit shellscript zu benutzen, ja wie diskutiert nicht verwenden.

Danke schonmal, falls möglich!

Uli

Markus Bloch

Hallo Uli,

Asche auf mein Haupt. Ja werde ich umsetzen ;-)

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Markus Bloch

Hallo Uli,

ich hab soeben eine neue Version im SVN bereitgestellt. Ab morgen kannst du diese Version via "update"-Befehl installieren.

Nach einem Neustart hast du die Möglichkeit den Count mit folgendem Attribut einzustellen:


attr <name> ping_count 1


Viel Spaß

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Uli Zappe

Zitat von: Markus Bloch schrieb am Sa, 18 Mai 2013 14:17ich hab soeben eine neue Version im SVN bereitgestellt.
Toll, tausend Dank!! :-))

Uli