PRESENCE cover version - anderer Ansatz basierend auf aktuellem Code

Begonnen von martinp876, 23 Dezember 2020, 14:38:45

Vorheriges Thema - Nächstes Thema

martinp876

@Benni
ich sehe auch keine Probleme - indbesondere bei der "state" implementierung. "presence" hat könnte und kann auch "maybe" enthalten - was ich bei state abgeschaltet habe.
Um den Sinn von Residence wirklich zu verstehen, welche features ich bekommen und warum diese nicht gleich in Presenz zu implementieren wären ist mir nicht klar.
Residence bezieht sich auf Personen und es sind Gruppen vorgegeben.
In Presence habe ich ein frei definierbares grouping vorgesehen (kostet ein einziges Attribut) und man kann beliebig groupieren und demnach änderungen in Gruppen erkennen indem man die Summen auswertet. Man könnte es noch auf die Namen erweitern und einen last-change angeben.

Aber RESDENCE bearbeite ich nicht.

News zu Bluetooth: ich habe meine Himbeere etwas untersucht
- bluetooth local kann ich einbauen fast wie es war. Man kann das schon jetzt über shellscript (logisch)
Mein test:
defmod prBTscan PRESENCE shellscript cmd:hcitool -i hci0 name 74:EB:80:91:59:45 scan:Galaxy

geht man von einem OS aus, welches sich nicht im laufenden Betrieb verändert, also BT installiert oder verändert wird, kann man den Namen des HCI device einmal (und nicht immer) suchen. Rückgabewert ist der Name -welcher auf nicht-blank untersucht wird.
Somit ist BTlocal verfügbar und funktioniert auf meiner Himbeere

defmod prBTgalaxy PRESENCE bluetooth 74:EB:80:91:59:45



martinp876

Anhang vergessen.

LAN-BT ist  nicht implementiert. braucht das auch jemand - wirklich? oder ist dies das eigentliche BT-scan?

Newbee

Zitat von: martinp876 am 28 Dezember 2020, 11:45:55
Anhang vergessen.

LAN-BT ist  nicht implementiert. braucht das auch jemand - wirklich? oder ist dies das eigentliche BT-scan?

Hallo Martin,

ich nutze das für ,,auf welcher Etage befindet sich ein Device" und hatte auch nur ,,LAN-BT" bis heute aus dem PRESENCE-Modul genutzt.
Bin bis jetzt zufrieden damit, verfolge aber gespannt den aktuell thread hier.

Danke und Gruß...
Intel-NUC mit ubuntu server 20.04; FHEM 6.0
HM, Dect, Netatmo, Hue

binford6000

Zitat von: martinp876 am 28 Dezember 2020, 11:45:55
LAN-BT ist  nicht implementiert. braucht das auch jemand - wirklich? oder ist dies das eigentliche BT-scan?

Ja haben mehrere - inklusive mir - hier gepostet. Lan-Bluetooth arbeitet mit presenced und collectord zusammen
und dient dem auffinden von BLE-Geräten wie den weit verbreiteten gtags.

Ist halt praktisch wenn fhem zB. im Container läuft und man keinen Bluetooth-Stick für local-bloutooth anschließen kann/will.

VG Sebastian

VG Sebastian

binford6000

Zitat von: martinp876 am 28 Dezember 2020, 11:45:55
Anhang vergessen.

LAN-BT ist  nicht implementiert. braucht das auch jemand - wirklich? oder ist dies das eigentliche BT-scan?

Mit der angehängten Version kommt  für dieses PRESENCE Gerät

Internals:
   DEF        function cmd:{checkAllFritzMACpresent('B8:F1:2A:31:A0:55')} scan:30
   FUUID      5fe9c90e-f33f-fe74-3f0e-ee36eeacfe933dbf
   FVERSION   73_PRESENCE.pm:0.183140/2019-01-18
   MODE       function
   NAME       sebastian_iphone.pre
   NOTIFYDEV  global
   NR         88
   NTFY_ORDER 50-sebastian_iphone.pre
   STATE      absent
   TYPE       PRESENCE
   CL:
     Authenticated 0
     BUF       
     FD         17
     FW_ID      151
     LASTACCESS 1609159087
     NAME       WEB_10.3.3.31_52931
     NR         150
     PEER       10.3.3.31
     PORT       52931
     SNAME      WEB
     SSL       
     STATE      Connected
     TEMPORARY  1
     TYPE       FHEMWEB
     canAsyncOutput 1
     READINGS:
       2020-12-28 13:35:03   state           Connected
   READINGS:
     2020-12-28 13:31:40   lastDeparture   2020-12-28 13:31:40
     2020-12-28 13:31:00   model           function
     2020-12-28 13:37:40   presence        absent
     2020-12-28 13:37:40   state           absent
   helper:
     curState   absent
     maybe      0
     nextScan   1609159090.65303
     cnt:
       exec       13
       maybe      0
       state      0
       th         0
     interval:
       absent     1
       init       30
       present    1
     os:
       Cmd        {checkAllFritzMACpresent('B8:F1:2A:31:A0:55')}
       search     30
     timestamp:
       absent     2020-12-28 13:31:40
Attributes:
   event-on-change-reading .*
   intervalNormal 1
   intervalPresent 1
   prGroup    dynamic
   verbose    5


OK


folgende Meldung im Log:
2020.12.28 13:36:40.681 5:  PRESENCE (sebastian_iphone.pre) - ping command "{checkAllFritzMACpresent('B8:F1:2A:31:A0:55')}" returned with output:#> absent


VG Sebastian

Frank_Huber


binford6000


martinp876

Bei function kannst du das kommando auch in der eingabezeile abschicken und die antwort prüfen.
Da ich dein modul nicht nutze kann ich auch nicht prüfen ob das korrekte zurück kommt

gestein

#53
Hallo,

habe gerade den neuen Code eingespielt und die Definitionen wieder angepasst.

function cmd:{CheckPresenceSMB(\"192.168.0.109\", \"workgroup\")} scan:1

Leider bekomme ich folgende Fehlermeldung bei "verbose 5" und das Device ist immer "present".
2020.12.28 19:23:27.334 5: PRESENCE (presenceDNS323SMB) - ping command "{CheckPresenceSMB(\"192.168.0.109\", \"workgroup\")}" returned with output:#> present
########Can't find string terminator '"' anywhere before EOF at (eval 65688) line 1.


Vielleicht habe ich etwas übersehen?
lg, Gerhard

Edit:
Wenn ich den String direkt in der eingabezeile eingebe, kommt auch der Fehler. Wenn ich die "\"" durch ein einfaches ersetze, dann klappt es.

martinp876

#54
wenn du es ohne \ eingibst kommt ein anderer Fehler.
"Funktion" führt ein FHEM Kommando aus - alltäglich also. So wie du es an vielen andere Stellen auch eingeben kannst. PRESENZ macht erstmal nix damit.
=> du kannst das Kommando schlicht in die Kommandizeile pasten und es MUSS funktionieren.
In deinem Fall ganz einfach, da keine Variablen verwendet werden (das wäre auch schwierig und ist nicht unterstützt)

die {} braucht man (wie allgemein an diversen stellen zumindest indirekt beschrieben) um beliebige Subroutinen beliebiger Module aufzurufen.
Du setzt also voraus, dass eine Funktion "CheckPresenceSMB" in deiner FHEM installation  zu Verfügung steht - was offensichtlich nicht der Fall ist.
Dazu 3 Anmerkungen
1) teste indem zu in die Kommandozeile pastest und abschickst
{CheckPresenceSMB("192.168.0.109","workgroup")}
{gettimeofday()}
{ReadingsVal("global","state","warnix")}
du bekommst einen string zurück welcher geparst wird
2) CheckPresenceSMB
kenne ich nicht - habe es auch nicht im "alten" Presence gefunden. Keine Ahnung, wo die Funktion einst war und was sie machen sollte
3) Nutzung von Funktionen
FHEM ist skript-basierend - alles ist offen. Du kannst jede Funktion jedes Moduls nutzen. Sinnvoll ist das nicht. Ich nehme mir das Recht heraus, Subroutinen meiner Module nach meinem Gusto ungefragt zu ändern. Das gleiche gilt für die Daten. Alle öffentlichen Funktionen und Daten muss ich hingegen beibehalten oder nur vorsichtig ändern. Öffentlich sind alle Attribute und Readings, auch Internals. Nicht hingegen Helper Variablen und Daten. Öffentliche Funktionen stelle ich eigentlich keine zu verfügung - nur was ein get oder set bereit stellt.
=> Wer auch immer die Funktion geschrieben hat muss dir sagen, wo sie nun hin ist.

PS:
Habe gesucht: auch checkAllFritzMACpresent kann ich in den FHEM files sowie den alten Code nicht finden.
Es wäre auch eine Unart, die Subroutine nicht mit dem Modulnamen zu beginnen.
Hattet ihr Subs in eigenen Module definiert? myUtils o.ä.?


gestein

Hallo Martin,

Wenn ich die Funktion in der Eingabezeile eingebe, dann klappt es:
function cmd:{CheckPresenceSMB("192.168.0.109", "workgroup")} scan:1

Und wenn ich die Zeile in der Definition ohne "\" eingebe, klappt es.

CheckPresenceSMB ist einfach eine perl-Funktion von mir, die "1" zurückliefert, wenn der Server über SMB erreichbar ist und "0" wenn nicht.
Das klappt auch so.
Ich denke, dass war in Deinem Mail von 08:04:19 einfach ein Copy&Paste-Fehler.
Der richtige Aufruf lautet also ohne "\".
Damit funktioniert es auch - kein Problem mehr.

Super, vielen Dank!
lg, Gerhard

binford6000

Zitat von: martinp876 am 28 Dezember 2020, 19:29:09
Bei function kannst du das kommando auch in der eingabezeile abschicken und die antwort prüfen.
Da ich dein modul nicht nutze kann ich auch nicht prüfen ob das korrekte zurück kommt

Wenn ich die sub
{checkAllFritzMACpresent("B8:F1:2A:31:A0:55")}
in die Adresszeile eingebe kommt korrekterweise eine 1 (weil present) zurück  :o


  • Das alte PRESENCE liefert present. Das neue absent mit obiger Fehlermeldung im Log.
  • Die Fehlermeldung passt ja auch nicht zum MODE function

Die sub {checkAllFritzMACpresent(MAC)} gibts im Wiki und ist auch schon was älter aber bewährt:
sub checkAllFritzMACpresent($) {
# Benötigt: nur die zu suchende MAC ($MAC),
# Es werden alle Instanzen vom Type FRITZBOX abgefragt
#
# Rückgabe: 1 = Gerät gefunden
#           0 = Gerät nicht gefunden
my ($MAC) = @_;
# Wird in keiner Instanz die MAC Adresse gefunden bleibt der Status 0
my $Status = 0;
$MAC =~ tr/:/_/;
$MAC = "mac_".uc($MAC);
my @FBS = devspec2array("TYPE=FRITZBOX");
foreach( @FBS ) {
my $StatusFritz = ReadingsVal($_, $MAC, "weg");
if ($StatusFritz eq "weg") {
}
elsif ($StatusFritz eq "inactive") {
}
else {
# Reading existiert, Rückgabewert ist nicht "inactive", also ist das Gerät am Netzwerk angemeldet.
$Status = 1;
}
}
return $Status
}


VG Sebatsian

Frank_Huber

Das ist kein Fehler.
Du fragst nach 30 ab, es kommt 1 zurück, also absent.
Pässe Deine config an auf scan 1 dann sollte es gehen.

binford6000

Zitat von: Frank_Huber am 28 Dezember 2020, 21:40:49
Das ist kein Fehler.
Du fragst nach 30 ab, es kommt 1 zurück, also absent.
Pässe Deine config an auf scan 1 dann sollte es gehen.

Zitat2er kette. #><commando><#>suchstring<#

Danke, jetzt hab ich es kapiert  ;)

martinp876

der Morgen Update - nach den Infos von Gestern

  • 1) function
    die Prüfung auf "{}" entfällt. Das gleicht es etwas an sonstige Kommandos an und erlaubt auch ein
    mydevice get status
    und sonstige Kommandos. Function liegt immer in der Verantwortung des Anwenders
  • 2) Variablen in Kommandos
    $NAME und $ADDRESS werden als Variablen in den Kommandos unterstützt und gegen deren Wert ersetzt
  • 3) die angesprochene Subroutine
    hatte ich also oneliner erstellt
    defmod prfunct PRESENCE function cmd:{scalar(grep !/inactive/,devspec2array("TYPE=FRITZBOX:FILTER=mac_3C_A9_F4_A3_16_80=..*"))} scan:1
    macht das gleiche. Nun, fast. Es wird die Anzahl der gefundenen Devices rückgemeldet - aber das ist voraussichtlich nur eine Fritzbox - oder eben keine
    Allerdings meine ich, dass die Implementierung der FRITZBOX nicht passt. Ich habe hier eine eigenen Version - welche nicht komplett ist. Die offizielle Version ist für mich wieder einmal am Ziel vorbei.
  • 4) lan-bluetooth
    hatte ich befürchtet. das scheint das komplizierteste - ich werden es prüfen und ggf einbauen
    Es besteht also Hoffnung

Im Update die Version ohne Prüfung der {} und mit unterstützung von $NAME/$ADDRESS. ADDRESS ist bei Function noch nicht vorhanden...