[Gelöst] OpenMQTTGateway + Gigaset Keeper, letzte MAC abfragen

Begonnen von cs301, 06 Dezember 2020, 23:33:00

Vorheriges Thema - Nächstes Thema

cs301

Ein nettes Hallo in die Runde,

Mein Langziel:
Ich möchte die Anwesenheit zweier Gigaset Keeper Tags mittels OpenMQTTGateway erkennen.
Gedacht habe ich es mir so, sobald die MAC eines Tags erkannt wird, wird ein Status (Anwesenheit) mit Timer gesetzt, also wenn Tag erkannt dann setzte On und resete Timer. Wenn Timer abgelaufen dann Off.
Der Status beider Tags sollen dann als eine Anwesenheit zusammengefasst werden und für weitere Auswertungen genutzt werden. (DOIF Einzeiler wäre mir am liebsten, aber das überblicke ich noch nicht.)

Leider scheitere ich schon ganz am Anfang, also beim Abfragen der zuletzt erkannten  MAC... :(
Das OpenMQTTGateway hat das entsprechende BLE Template bekommen:

defmod MQTT2_OpenMQTTGateway_ESP32_BLE MQTT2_DEVICE OpenMQTTGateway_ESP32_BLE
attr MQTT2_OpenMQTTGateway_ESP32_BLE IODev MQTT2_FHEM_Server
attr MQTT2_OpenMQTTGateway_ESP32_BLE autocreate 1
attr MQTT2_OpenMQTTGateway_ESP32_BLE model OpenMQTTGateway_BT_scanner
attr MQTT2_OpenMQTTGateway_ESP32_BLE periodicCmd deleteReadings:1440
attr MQTT2_OpenMQTTGateway_ESP32_BLE readingList home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/([0-9A-Z]+):.* { $TOPIC =~ m,BTtoMQTT/([0-9A-Z]+),;; json2nameValue($EVENT,"$1"."_") }\
  home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/([0-9A-Z]+)/[^:]+:.* { $TOPIC =~ m,BTtoMQTT/([0-9A-Z]+)/([^:]+),;; { "${1}_$2"=>$EVENT }}\
  home/home_presence/OpenMQTTGateway_ESP32_BLE:.* { return unless $EVENT =~ m,(..):(..):(..):(..):(..):(..),;;;; json2nameValue($EVENT,"BT_".uc($1.$2.$3.$4.$5.$6)."_");;;; {"last"=>uc($1.$2.$3.$4.$5.$6)}}\
OpenMQTTGateway_ESP32_BLE:home/OpenMQTTGateway_ESP32_BLE/SYStoMQTT:.* { json2nameValue($EVENT) }
attr MQTT2_OpenMQTTGateway_ESP32_BLE room MQTT2_DEVICE
attr MQTT2_OpenMQTTGateway_ESP32_BLE setList BT_scan_now:noArg home/OpenMQTTGateway_ESP32_BLE/commands/MQTTtoBT/config {"interval":0}\
  BT_scan_interval:textField home/OpenMQTTGateway_ESP32_BLE/commands/MQTTtoBT/config {"interval":$EVTPART1}\
  BT_blacklist:textField home/OpenMQTTGateway_ESP32_BLE/commands/MQTTtoBT/config {"black-list":[$EVTPART1]}\
  BT_whitelist:textField home/OpenMQTTGateway_ESP32_BLE/commands/MQTTtoBT/config {"white-list":[$EVTPART1]}\
  BT_minrssi:slider,-110,1,0 home/OpenMQTTGateway_ESP32_BLE/commands/MQTTtoBT/config {"minrssi":$EVTPART1}}\
  deleteReadings:noArg {fhem "deletereading -q $NAME (?!associatedWith).*"}
attr MQTT2_OpenMQTTGateway_ESP32_BLE stateFormat Last: last

setstate MQTT2_OpenMQTTGateway_ESP32_BLE Last: 7C2F80EFF5AE
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:52 7C2F80EFF5AE_distance 0.708318
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:52 7C2F80EFF5AE_id 7C:2F:80:EF:F5:AE
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:52 7C2F80EFF5AE_name Gigaset keeper
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:52 7C2F80EFF5AE_rssi -57
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:54:47 7C2F80EFF5E8_distance 0.412494
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:54:47 7C2F80EFF5E8_id 7C:2F:80:EF:F5:E8
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:54:47 7C2F80EFF5E8_name Gigaset keeper
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:54:47 7C2F80EFF5E8_rssi -54
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 LWT online
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 SSID TP-LINK_AC5_2.4GHz
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:27:40 attrTemplateVersion 20200522 or prior
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 cmd_t home/OpenMQTTGateway_ESP32_BLE/commands/MQTTtoSYS/config
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 dev_cla connectivity
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 device_identifiers_1 F008D1D1B60C
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 device_manufacturer OMG_community
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 device_name OpenMQTTGateway_ESP32_BLE
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 device_sw_version v0.9.5
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:27:24 distance 1.135236
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 freemem 178320
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:27:24 id 7C:2F:80:EF:F5:AE
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 interval 55555
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 ip 192.168.1.112
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:52 last 7C2F80EFF5AE
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 lowpowermode 0
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 mac F0:08:D1:D1:B6:0C
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:27:24 manufacturerdata 80010215010080eff5aec5
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 modules BTHADiscovery
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:27:24 name Gigaset keeper
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 pl_avail online
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 pl_not_avail offline
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 pl_off offline
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 pl_on {"cmd":"erase"}
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 rssi -45
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 scanbcnct 10
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-05 23:55:58 servicedata 4918f2110544d882649de1336f8639d3b0d27344
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 stat_t home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:28:16 state BT_minrssi
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:46:26 subscriptions home/OpenMQTTGateway_ESP32_BLE/commands/#
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:55:40 txpower 12
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 uniq_id F008D1D1B60CgatewayBT
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 uptime 5166
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 21:29:17 val_tpl {{ value_json.id | is_defined }}
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 version v0.9.5
setstate MQTT2_OpenMQTTGateway_ESP32_BLE 2020-12-06 22:55:17 wifiprt 0



...die letzte MAC wird auch mittels "Last" State ausgegeben.
DeviceOverview
MQTT2_OpenMQTTGateway_ESP32_BLE                     Last: 7C2F80EFF5AE


Diesen versuche ich auszuwerten (Beispiel aus Hilfe angepasst):
defmod Anwesenheit_keeperTag MQTT2_DEVICE
attr Anwesenheit_keeperTag autocreate 1
attr Anwesenheit_keeperTag readingList OpenMQTTGateway_ESP32_BLE:home/home_presence/OpenMQTTGateway_ESP32_BLE:.* { json2nameValue($EVENT) }
attr Anwesenheit_keeperTag room zuHause
attr Anwesenheit_keeperTag stateFormat {\
if(ReadingsVal("MQTT2_OpenMQTTGateway_ESP32_BLE","Last",0) eq "7C2F80EFF5AE") {\
sprintf("keeperTag:7C2F80EFF5AE anwesend");;\
} else {\
sprintf("XXX anwesend");; \
}\
}

setstate Anwesenheit_keeperTag XXX anwesend
setstate Anwesenheit_keeperTag 2020-12-06 22:58:06 distance 0.412494
setstate Anwesenheit_keeperTag 2020-12-06 22:58:06 id 7C:2F:80:EF:F5:E8
setstate Anwesenheit_keeperTag 2020-12-06 22:58:06 manufacturerdata 80010215010080eff5e8c5
setstate Anwesenheit_keeperTag 2020-12-06 22:58:06 name Gigaset keeper
setstate Anwesenheit_keeperTag 2020-12-06 22:58:06 rssi -54


Ich habe if(ReadingsVal("MQTT2_OpenMQTTGateway_ESP32_BLE","Last",0) eq "7C2F80EFF5AE") {\ gewählt, da hier ja das Device, also das BLEGateway die letzte MAC unter dem Last State ausgibt. Jedoch wird immer 0 ausgegeben. Ich hatte hier vorher, "id" abgefragt, das OpenMQTTGateway hatte aber kein Template zugewiesen. Aber auch das funktionierte nicht.

Oder liegt das Problem evtl. am Reading? attr Anwesenheit_keeperTag readingList OpenMQTTGateway_ESP32_BLE:home/home_presence/OpenMQTTGateway_ESP32_BLE:.* { json2nameValue($EVENT) } Jedoch kann ich hier nicht MQTT2_OpenMQTTGateway_ESP32_BLE:Last angeben. Vorher ohne Template hieß das Device nur "OpenMQTTGateway_ESP32_BLE", ohne vorangestelltes"MQTT2_ "

Über einen Hinweis wäre ich sehr dankbar.

MfG
Carsten

OdfFhem

@cs301

Das Attribut stateFormat besagt, dass das Reading nicht Last, sondern last heißt ...

Beta-User

Du darfst gerne mitwirken, um das attrTemplate "OpenMQTTGateway_BT_gtag" zu verbessern und/oder besser zu erklären:
Zitat
use this with an OpenMQTTGateway. For further details visit https://github.com/1technophile/OpenMQTTGateway/wiki<br>Recommended structure of the topic pattern home/OpenMQTTGateway/.*.<br>NOTE: You'll be asked to provide the HEX address of your gtag. Best start with looking at what "OpenMQTTGateway_BT_scanner" povides, e.g. if you have a reading name like "6C697244245E_id", "6C697244245E" (without quotes) is what you want to enter...<br>NOTE: this will create a new device!
Tatsächlich sollte man damit direkt ein PRESENCE-fähiges Dingens haben, und über den Zusatzcode, der irgendwo in dem "OpenMQTTGateway-Thead" zu finden sein sollte, kann man sogar versuchen, den Standort des Tags zu lokalisieren...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

cs301

@OdfFhem
Vielen Dank, mit "last" statt "Last" klappt es mit dem Status.

@Beta-User
Soweit in der Materie stecke ich noch gar nicht drin, um etwas verbessern zu können.
Ich gucke mir die anderen Templates dann auch mal an, habe nur die Befürchtung, dass dann mein jetziger Code nicht mehr funktioniert und ich noch verwirrter da stehe.
Ich brauche erstmal irgendwie einen Erfolg... ;)
Schön wäre, wenn der OpenMQTTGateway_BLE einfach ein 1/0 Presence-Status zurück gibt, bei Vorhandensein einer der MACs auf der Whitelist. Das würde schon reichen.


Und leider komme ich jetzt zum nächsten Problem zur nächsten Unwissenheit. Der "last" State ist statisch, bleibt also immer 1, bis die andere MAC gefunden wird.
Wenn ich beide Statuswerte abfrage, dann ist auch bei Abwesenheit beider Tags, der "last" Status immer noch vorhanden, nur eben mit zurückliegendem Zeitstempel.
Gibt es eine Möglichkeit den State des MQTT2 Devices intern zeitverzögert zurückzusetzen?
defmod Anwesenheit_Tag2 MQTT2_DEVICE
attr Anwesenheit_Tag2 IODev MQTT2_FHEM_Server
attr Anwesenheit_Tag2 autocreate 1
attr Anwesenheit_Tag2 readingList OpenMQTTGateway_ESP32_BLE:home/home_presence/OpenMQTTGateway_ESP32_BLE:.* { json2nameValue($EVENT) }
attr Anwesenheit_Tag2 room zuHause
attr Anwesenheit_Tag2 setList on-for-timer state
attr Anwesenheit_Tag2 stateFormat {\
if(ReadingsVal("MQTT2_OpenMQTTGateway_ESP32_BLE","last",0) eq "7C2F80EFF5E8") {\
sprintf("1");;\
} else {\
sprintf("0");; \
}\
}


defmod Anwesenheit_Tag1 MQTT2_DEVICE
attr Anwesenheit_Tag1 IODev MQTT2_FHEM_Server
attr Anwesenheit_Tag1 autocreate 1
attr Anwesenheit_Tag1 readingList OpenMQTTGateway_ESP32_BLE:home/home_presence/OpenMQTTGateway_ESP32_BLE:.* { json2nameValue($EVENT) }
attr Anwesenheit_Tag1 room zuHause
attr Anwesenheit_Tag1 setList on-for-timer state
attr Anwesenheit_Tag1 stateFormat {\
if(ReadingsVal("MQTT2_OpenMQTTGateway_ESP32_BLE","last",0) eq "7C2F80EFF5AE") {\
sprintf("1");;\
} else {\
sprintf("0");; \
}\
}


defmod Anwesenheit dummy
attr Anwesenheit room zuHause


defmod AnwesenheitOn notify Anwesenheit_Tag1:state||Anwesenheit_Tag2:state set Anwesenheit on

defmod AnwesenheitOff watchdog Anwesenheit_Tag1:state||Anwesenheit_Tag2:state 00:01:30 SAME set Anwesenheit off
Soweit ich das richtig verstehe, schaltet der Watchdog den Anwesenheit off, sobald der Status von Anwesenheit_Tag1 ODER Anwesenheit_Tag2 für 1:30 gleichgeblieben ist. Ich habe beide Tags außer Reichweite, der letzte Status der beiden Devices bleibt also unverändert. Jedoch schaltet das nichts um.

Gibt es eine einfache Möglichkeit innerhalb der if(ReadingsVal ... den State zeitverzögert zurück zu setzen? Quasi ein RS Kippglied mit nem Timer am R Eingang.  ;)

Ich empfinde das irgendwie als zuviel Text für zuwenig Funktion. Das geht doch best. mit DOIF auch irgendwie? Nur wie greife ich da auf MQTT2_OpenMQTTGateway_ESP32_BLE","last" zu und führe den MAC Vergleich durch?  ::)

Bissel Selbstmitleid: Momentan fühle ich mich, als wenn ich gegen jeden Baum im Wald rennen...  Im Kopf ist der Ablauf klar, nur die Umsetzung scheitert aufgrund zu vieler Möglichkeiten :-\

Beta-User

OpenMQTTGateway ist ein "ziemlich schwieriges" MQTT-Gerät, und es ist völlig ok, wenn man da erst mal nicht durchblickt. Es war zugegebenermaßen auch für mich nicht ganz einfach, das ganze irgendwie sinnvoll zu strukturieren.

Grundsätzlich müßte aber jedes BT-Gerät auch was an "home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/7C2F80EFF5E8" (bzw. die andere ID) senden (oder was auch immer du als "base id" statt home eingestellt hast). Das siehst du nur nicht mehr separat, weil das "Basisgerät" bzw. der BT-scanner das einfängt. Das auszuwerten ist aber m.E. einfacher, als an "last" anzuknüpfen, das eher als Hilfsinfo gedacht war, wenn man auf der Suche nach "neuen" Devices ist.

Und mit anderen Devices parallel zu arbeiten, macht ja erst mal nichts kaputt, du kannst dann immer noch entscheiden, welche Variante dir besser gefällt. Mein erster PRESENCE-Versuch (und noch ein paar mehr Anmerkungen in den Folgebeiträgen) ist hier zu finden: https://forum.fhem.de/index.php/topic,103737.msg1025379.html#msg1025379, vielleicht wird es dann etwas einleuchtender.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

cs301

#5
@Beta-User

Du meinst die folgende Zeile?
defmod FFFFC424A123_presence PRESENCE function { my $maxage = AttrVal("OMG_FFFFC424A123","maxPresenceAge","300");;;; ReadingsAge("OMG_FFFFC424A123","Last_IO","100000") < $maxage ? 1 : 0 }

Ich habe jetzt zwei Presence Module angelegt und entsprechend angepasst.
defmod 7C2F80EFF5AE_presence PRESENCE function { my $maxage = AttrVal("GTag_Beata","maxPresenceAge","90");;;; ReadingsAge("GTag_Beata","last_IO","100000") < $maxage ? 1 : 0 }
Ich habe den Modulen Alias verpasst deswegen "GTag_xxx".

Mit folgendem wurde das GTag Device erzeugt. set MQTT2_OpenMQTTGateway_ESP32_BLE attrTemplate OpenMQTTGateway_BT_gtag 7C2F80EFF5AE

Daraus wurde...
defmod OMG_7C2F80EFF5AE MQTT2_DEVICE 7C2F80EFF5AE
attr OMG_7C2F80EFF5AE IODev MQTT2_FHEM_Server
attr OMG_7C2F80EFF5AE alias GTag_Beata
attr OMG_7C2F80EFF5AE autocreate 0
attr OMG_7C2F80EFF5AE event-min-interval 300
attr OMG_7C2F80EFF5AE icon gtag_kontur
attr OMG_7C2F80EFF5AE model OpenMQTTGateway_BT_gtag
attr OMG_7C2F80EFF5AE readingList home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT/7C2F80EFF5AE:.* { $TOPIC =~ m,home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT,;;;; json2nameValue($EVENT, "${1}_") }\
  home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT/7C2F80EFF5AE:.* { $TOPIC =~ m,home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT,;;;; {"last_IO"=>"$1"}}
attr OMG_7C2F80EFF5AE room MQTT2_DEVICE
attr OMG_7C2F80EFF5AE stateFormat Last IO: last_IO


CFGFN
CID 7C2F80EFF5AE
DEF 7C2F80EFF5AE
DEVICETOPIC OMG_7C2F80EFF5AE
FUUID 5fce2f80-f33f-996e-2e66-236a424818a4401b
IODev MQTT2_FHEM_Server
LASTInputDev MQTT2_FHEM_Server
MQTT2_FHEM_Server_MSGCNT 38
MQTT2_FHEM_Server_TIME 2020-12-07 14:59:54
MSGCNT 38
NAME OMG_7C2F80EFF5AE
NR 91
STATE Last IO: OpenMQTTGateway_ESP32_BLE
TYPE MQTT2_DEVICE


Das Device gibt jedoch nur Last IO: OpenMQTTGateway_ESP32_BLE aus und die obige Presence Abfrage tut nichts, beide stehen auf absent. Ich habe auch das erwähnte "Last_IO" auf "last_IO" abgeändert.

Was habe ich übersehen?

EDIT: Es funktioniert nicht mit Alias, es muss der richtige Name "OMG_7C2F80EFF5AE" sein...
defmod 7C2F80EFF5AE_presence PRESENCE function { my $maxage = AttrVal("GTag_Beata","maxPresenceAge","90");;;; ReadingsAge("GTag_Beata","last_IO","100000") < $maxage ? 1 : 0 }
defmod 7C2F80EFF5AE_presence PRESENCE function { my $maxage = AttrVal("OMG_7C2F80EFF5AE","maxPresenceAge","90");;;; ReadingsAge("OMG_7C2F80EFF5AE","last_IO","100000") < $maxage ? 1 : 0 }

Beta-User

War grade am Antworten, aber du hast ja selbst gemerkt, dass das mit dem alias die Ursache war :) .

Generell ist es bei diesen nur auszugsweisen listings immer etwas schwierig zu erkennen, welche Readings denn jetzt exisiteren, aber die Korrektur auf "last_IO" müßte ok sein.

Falls noch was nicht passt, wäre es besser, du würdest eine RAW-Definition mit den Readings samt timestamp liefern, dann kann ich ggf. leichter erkennen, wes hakt. Das ganze ist - was PRESENCE angeht - leider etwas ins Stocken geraten, vermutlich gibt es bald noch einen update für die attrTemplate, dann zeigt das auch ein vernünftiges Icon an, die Beschreibung ist etwas erklärender usw...

Generell sind da noch zu viele ;;;; drin, die können zum großen Teil raus (sorry).

(Ich selbst nutze eher die BT-Xiaomi-Temp/Hum-Sensoren, und das klappt wunderbar; die anderen Teile hatte ich mangels Interesse der damals Beteiligten dann etwas auf die Seite gelegt. Generell wäre es klasse, wenn sich ein Freiwilliger findet, der einen kurzen Wiki-Artikel dazu machen könnte (ähnlich wie das ein anderer "newbie" bei zigbee2tasmota mal gemacht hat... https://wiki.fhem.de/wiki/MQTT#OpenMQTTGateway ist etwas sehr "dünn"; siehe https://wiki.fhem.de/wiki/Zigbee2Tasmota-MQTT bzw. https://forum.fhem.de/index.php/topic,113374.msg1076741.html#msg1076741)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

cs301

Ufff, also wenn mein bisheriges Tun, also Codeschnipsel aneinander reihen und anpassen, ausreicht um ein Wiki aufzusetzen, dann kann ich es versuchen. Letztendlich führte es zum gewünschten Teilerfolg. ;D
Das Verständnis kommt leider nur langsam.

Wo bzw. wie kann ich mir eigentlich das genutzte Template anzeigen lassen? template show OpenMQTTGateway_BT_gtag.template funktioniert so nicht.
Woran erkennt das Template, dass der Tag Verfügbar ist? RSSI Wert? Kann der irgendwie angepasst werden?

Vielen Dank nochmal

Beta-User

Also beim Wiki geht es "nur" darum, den Ablauf der Gesamteinrichtung mal zu zeigen, wobei es eigentlich nur um Bluetooth geht (OMG "kann" noch deutlich mehr, aber ich habe mich damit auch nie auseinandergesetzt, weil aus FHEM-Sicht die RF-Optionen mit CUL&Co schon immer auf ähnlichem Niveau waren...).

Da kann "jeder" sich am Entwicklungsthread zu den attrTemplate entlanghangeln; das ist nur eben "etwas länglich", und die ganzen Irrwege zwischendurch interessieren ja eigentlich auch keinen mehr => straffen, einfachsten Weg aufzeigen für verschiedene Geräte & gut ist...

(Ich bin nur so betriebsblind, dass das bei mir tendenziell zu straff wird, daher ist es tendenziell besser, wenn das ein "Anfänger" für andere Anfänger formuliert...)



Zu deinen technischen Fragen:

Bei MQTT2_DEVICE werden die Infos über das verwendete attrTemplate in "model" und die Version davon in ein Reading vercoded und sind dann über die list-Ausgaben verfügbar.

Wenn du wissen willst, was es so alles gibt, geht
set <someMQTT2_DEVICE> attrTemplate ?
und beim Auswählen des betreffenden attrTemplate über FHEMWEB/die Detailseite eines passenden Geräts kann man auch den (bereinigten) Quelltext sehen, weiß also im Prinzip vorher, was passieren wird (das mag nicht immer verständlich sein, aber das ist ein anderes Thema).

Und das "Template" erkennt auch nicht, ob der Tag verfügbar ist, das durch das attrTemplate konfigurierte Device wertet einfach nur die Daten aus, die der MQTT-Server empfängt und weiterleitet. Der RSSI-Wert ist "given", er wird von dem Microcontroller (typ. ESP32) ermittelt, SOBALD er irgendwas via BT von dem Tag empfängt. Du kannst lediglich entscheiden, ab wann das Signal verworfen werden soll, also welcher Mindestwert erreicht sein soll ;) .
Aber da sind wir dann schon bei der Frage, ab wo dann in die Doku zu OMG zu verlinken ist, denn das müßte irgendwo dort zu finden sein ;D .

ABER: es gibt einen (noch zu verbessernden) Code-Schnipsel, der es ermöglicht festzustellen, über welches von mehreren GW's denn der bessere RSSI-Wert gegeben ist und darüber den "Ort" abzuschätzen, an welchem sich der BT-Tag denn befindet... Und dafür gibt es auch wieder irgendwelche Grenzwerte und -dauern (via Attribut einstellbar) , für die sich aber bisher keiner besonders interessiert hatte; da habe ich wohl zu kompliziert gedacht ::) ...? Oder es hat jemand bessere Wege gefunden?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

cs301

Ja, die Template Auflistung hab ich gesehen, aber mich interresiert tatsächlich der Code/Ablauf im Template. Es sei denn, wir bekommen folgende Unklarheit gelöst.
Weil, es taucht bei mir ein nicht löschbares neues "MQTT2_oMQTTgw_BT         ? ? ? " Device auf, von dem ich nicht weiß wo es her kommt.

Internals:
   CFGFN     
   CID        oMQTTgw_BT
   DEF        oMQTTgw_BT
   DEVICETOPIC MQTT2_oMQTTgw_BT
   FUUID      5fce7ae3-f33f-996e-69c1-623458a6e5b23835
   IODev      MQTT2_FHEM_Server
   LASTInputDev MQTT2_FHEM_Server
   MQTT2_FHEM_Server_MSGCNT 35
   MQTT2_FHEM_Server_TIME 2020-12-07 20:17:24
   MSGCNT     35
   NAME       MQTT2_oMQTTgw_BT
   NR         1634
   STATE      ???
   TYPE       MQTT2_DEVICE
   READINGS:
     2020-12-07 20:15:14   associatedWith  MQTT2_OpenMQTTGateway_ESP32_BLE
     2020-12-07 20:17:24   distance        13.81901
     2020-12-07 20:17:24   id              12:27:C7:E5:02:09
     2020-12-07 20:17:24   rssi            -84
     2020-12-07 20:07:37   servicedata     abafce123c233f367db38ac833e2f9570d24e5cf
     2020-12-07 20:16:18   txpower         12
Attributes:
   IODev      MQTT2_FHEM_Server
   readingList home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/218C1EB4324C:.* { json2nameValue($EVENT) }
home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/742943E8C2E9:.* { json2nameValue($EVENT) }
home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/12B6858F5001:.* { json2nameValue($EVENT) }
home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/4F887C37D354:.* { json2nameValue($EVENT) }
home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/34DC94565D5F:.* { json2nameValue($EVENT) }
home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/5EEC4D95A144:.* { json2nameValue($EVENT) }
home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/75EEDAB80E5D:.* { json2nameValue($EVENT) }
home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/1227C7E50209:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   verbose    5


Die eigentlich mit Template set angelegten Devices lauten ja "OMG_<MAC-Adresse>"
Internals:
   CFGFN     
   CID        7C2F80EFF5AE
   DEF        7C2F80EFF5AE
   DEVICETOPIC OMG_7C2F80EFF5AE
   FUUID      5fce2f80-f33f-996e-2e66-236a424818a4401b
   IODev      MQTT2_FHEM_Server
   LASTInputDev MQTT2_FHEM_Server
   MQTT2_FHEM_Server_MSGCNT 200
   MQTT2_FHEM_Server_TIME 2020-12-07 20:18:30
   MSGCNT     200
   NAME       OMG_7C2F80EFF5AE
   NR         91
   STATE      Last IO: OpenMQTTGateway_ESP32_BLE
   TYPE       MQTT2_DEVICE
   READINGS:
     2020-12-07 20:18:30   OpenMQTTGateway_ESP32_BLE_distance 0.593417
     2020-12-07 20:18:30   OpenMQTTGateway_ESP32_BLE_id 7C:2F:80:EF:F5:AE
     2020-12-07 20:18:30   OpenMQTTGateway_ESP32_BLE_name Gigaset keeper
     2020-12-07 20:18:30   OpenMQTTGateway_ESP32_BLE_rssi -56
     2020-12-07 14:34:56   attrTemplateVersion 20200522 or prior
     2020-12-07 20:18:30   last_IO         OpenMQTTGateway_ESP32_BLE
Attributes:
   IODev      MQTT2_FHEM_Server
   alias      GTag_Beata
   autocreate 0
   event-min-interval 60
   icon       gtag_kontur
   model      OpenMQTTGateway_BT_gtag
   readingList home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT/7C2F80EFF5AE:.* { $TOPIC =~ m,home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT,;; json2nameValue($EVENT, "${1}_") }
  home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT/7C2F80EFF5AE:.* { $TOPIC =~ m,home/(O[^/]*M[^/]*G[^/]*)/BTtoMQTT,;; {"last_IO"=>"$1"}}
   room       MQTT2_DEVICE
   stateFormat Last IO: last_IO


Und hier das Hauptdevice "OpenMQTTGateway_ESP32_BLE". Benötige ich dieses noch, wenn die ganzen "Nebendevices"(nenn ich mal so) angelegt wurden?
Internals:
   CID        OpenMQTTGateway_ESP32_BLE
   DEF        OpenMQTTGateway_ESP32_BLE
   DEVICETOPIC MQTT2_OpenMQTTGateway_ESP32_BLE
   FUUID      5fce2990-f33f-996e-872b-7c0eb2f64181b19c
   IODev      MQTT2_FHEM_Server
   LASTInputDev MQTT2_FHEM_Server
   MQTT2_FHEM_Server_MSGCNT 725
   MQTT2_FHEM_Server_TIME 2020-12-07 20:19:36
   MSGCNT     725
   NAME       MQTT2_OpenMQTTGateway_ESP32_BLE
   NR         22
   STATE      <a href="http://192.168.1.112" target="_blank">
online
</a>Version: v0.9.5
   TYPE       MQTT2_DEVICE
   OLDREADINGS:
   READINGS:
     2020-12-07 19:56:48   LWT             online
     2020-12-07 20:18:33   Sys_SSID        TP-LINK_AC5_2.4GHz
     2020-12-07 20:18:33   Sys_freemem     145840
     2020-12-07 20:18:33   Sys_interval    55555
     2020-12-07 20:18:33   Sys_ip          192.168.1.112
     2020-12-07 20:18:33   Sys_lowpowermode 0
     2020-12-07 20:18:33   Sys_mac         F0:08:D1:D1:B6:0C
     2020-12-07 20:18:33   Sys_modules     BTHADiscovery
     2020-12-07 20:18:33   Sys_rssi        -43
     2020-12-07 20:18:33   Sys_scanbcnct   10
     2020-12-07 20:18:33   Sys_uptime      1324
     2020-12-07 20:18:33   Sys_version     v0.9.5
     2020-12-07 20:18:33   Sys_wifiprt     0
     2020-12-07 14:27:45   attrTemplateVersion 20200716
     2020-12-07 19:56:33   cmd_t           home/OpenMQTTGateway_ESP32_BLE/commands/MQTTtoSYS/config
     2020-12-07 19:56:33   device_identifiers_1 F008D1D1B60C
     2020-12-07 19:56:33   device_manufacturer OMG_community
     2020-12-07 19:56:33   device_name     OpenMQTTGateway_ESP32_BLE
     2020-12-07 19:56:33   device_sw_version v0.9.5
     2020-12-07 20:19:36   distance        0.495572
     2020-12-07 20:19:36   id              7C:2F:80:EF:F5:AE
     2020-12-07 20:19:36   manufacturerdata 80010215010080eff5aec5
     2020-12-07 20:19:36   name            Gigaset keeper
     2020-12-07 19:56:33   pl_avail        online
     2020-12-07 19:56:33   pl_not_avail    offline
     2020-12-07 19:56:33   pl_on           {"cmd":"erase"}
     2020-12-07 20:19:36   rssi            -55
     2020-12-07 19:56:33   stat_t          home/OpenMQTTGateway_ESP32_BLE/LWT
     2020-12-07 19:56:35   subscriptions   home/OpenMQTTGateway_ESP32_BLE/commands/#
     2020-12-07 20:16:18   txpower         12
     2020-12-07 19:56:33   uniq_id         F008D1D1B60Cerase
     2020-12-07 19:56:48   version         v0.9.5
Attributes:
   IODev      MQTT2_FHEM_Server
   autocreate 1
   bridgeRegexp home/OpenMQTTGateway_ESP32_BLE/BTtoMQTT/([0-9A-Z]+)[:/].* "oMQTTgw_BT"
  home/OpenMQTTGateway_ESP32_BLE/433toMQTT[:/].* "oMQTTgw_433"
  home/OpenMQTTGateway_ESP32_BLE/IRtoMQTT[:/].* "oMQTTgw_IR"
  home/OpenMQTTGateway_ESP32_BLE/CLIMAtoMQTT/([a-zA-Z0-9]+)[:/].* "OpenMQTTGateway_ESP32_BLE_$1"
   devStateIcon online:10px-kreis-gruen offline.*:10px-kreis-rot
   icon       mqtt
   model      OpenMQTTGateway_MCU
   readingList home/OpenMQTTGateway_ESP32_BLE/LWT:.* LWT
  home/OpenMQTTGateway_ESP32_BLE/version:.* version
  home/OpenMQTTGateway_ESP32_BLE/SYStoMQTT[:/].* { json2nameValue($EVENT,'Sys_')}
  homeassistant/[^/]*sensor/[^/]+/config:.* { }
OpenMQTTGateway_ESP32_BLE:home/home_presence/OpenMQTTGateway_ESP32_BLE:.* { json2nameValue($EVENT) }
OpenMQTTGateway_ESP32_BLE:homeassistant/switch/F008D1D1B60Crestart/config:.* { json2nameValue($EVENT) }
OpenMQTTGateway_ESP32_BLE:homeassistant/switch/F008D1D1B60Cerase/config:.* { json2nameValue($EVENT) }
   room       MQTT2_DEVICE
   setList    restart:noArg home/OpenMQTTGateway_ESP32_BLE/commands/MQTTtoSYS/config {"cmd":"restart"}
   stateFormat <a href="http://Sys_ip" target="_blank">
LWT
</a>Version: version
   verbose    3




Bzgl. Mindestsignalwert zum Verwerfen, den kann ich aber auch nirgend setzen. Einzig beim BT_Scanner Template tauchte ein Auswahlfeld mit RSSI auf.
Würde das klappen, wenn ich dem Device mit dem "BT_gtag" Template die folgenden Readings vom "BT_Scanner" Template hinzufüge?

attr DEVICE setList\
  BT_scan_now:noArg BASE_ID/DEVNAME/commands/MQTTtoBT/config {"interval":0}\
  BT_scan_interval:textField BASE_ID/DEVNAME/commands/MQTTtoBT/config {"interval":$EVTPART1}\
  BT_blacklist:textField BASE_ID/DEVNAME/commands/MQTTtoBT/config {"black-list":[$EVTPART1]}\
  BT_whitelist:textField BASE_ID/DEVNAME/commands/MQTTtoBT/config {"white-list":[$EVTPART1]}\
  BT_minrssi:slider,-110,1,0 BASE_ID/DEVNAME/commands/MQTTtoBT/config {"minrssi":$EVTPART1}}\
  deleteReadings:noArg {fhem "deletereading -q $NAME (?!associatedWith).*"}


Dann wundert mich die letzte Zeile
deleteReadings:noArg {fhem "deletereading -q $NAME (?!associatedWith).*"}
beim "BT_Scanner" wird dieses "associatedWith" gelöscht, beim "BT_gtag" ist dies mit drin.

Sry für die vielen Fragen, aber ich muss auch verstehen was hier passiert und nicht nur blind hinkopieren.  ;D

Beta-User

OK, da sind gleich "alle" möglichen Mißverständnisse drin...

Von hinten her:

OpenMQTTGateway ist kein reines BT-Empfangsdongle, das ist nur eine von vielen Optionen, die die firmware bietet. Dein "OpenMQTTGateway_ESP32_BLE" ist daher das "Zentraldevice", das für alle möglichen Anwendungsfälle von OMG "entscheiden" soll, was mit der Info zu geschehen hat, die der MQTT-Server erhält.
Ergo sollte man das behalten, jedenfalls, wenn man autocreate@MQTT2 nutzen will. Aber das ist - mit seiner bridgeRegexp - dafür "verantwortlich", dass immer wieder dieses "oMQTTgw_BT" erstellt wird; da landen nämlich alle Infos, die zu BT-Geräten gehören, für 433MHz gibt es ein zweites usw. (u.a. deswegen lautet der Titel des "Hauptthreads" zu OMG etwas irritierend OpenMQTTGateway -> MQTT und RollingCode .... mal wieder)

"oMQTTgw_BT" seinerseits ist auch nur eine Art Zwischen- oder Sammeldevice. Da landen einfach alle Infos, die alle OMG im Lauf eines Tages so einsammeln, alle 24h werden alle Readings _bis auf_ associatedWith gelöscht, wenn man das mit dem BT-scanner-attrTemplate konfiguriert - weil sich sonst unendlich viel Müll ansammelt, den keiner braucht... Dabei hilft "scanner", die eingehenden Infos so vorzuverarbeiten, dass man sieht, was eigentlich zusammengehört.
Daneben kann man eben ein paar BT-spezifische Befehle absetzen, die nicht auf ein bestimmtes BT-Gerät bezogen sind, sondern auf das GW. Man könnte diesen Teil auch auf das MCU-attrTemplate "umziehen", dann aber optional, weil ja nicht alle OMG überhaupt BT-Optionen haben müssen...
MAn. sollte man jedenfalls so oder so auch dieses "scanner"-Zwischendevice haben und die dortigen Readings ggf. einfach im laufenden Betrieb ignorieren. (u.A. deswegen war ich der Überzeugung, dass du am falschen Ende angefangen hast, als du da irgendwas auswerten wolltest).

Erst die weiteren (BT-) Geräte, die man dann (mit Hilfe des scanners) erstellt, indem man mit dem passenden attrTemplate  die BT-Adresse angibt, sind dann die eigentlichen Nutz-Devices.

Anders gesagt: hat man ein GW und ein G-Tag (oä), braucht man drei Devices (MCU, scanner, gtag), hat man zwei GW's, sind es vier (2*MCU, scanner, gtag), hat man zwei GW's, einen Temp/Hum und ein G-Tag, sind es fünf usw..

Hoffe, das ist nun etwas klarer?


Bei Gelegenheit muss ich mir mal noch die von autocreate ergänzten Einträge in der readingList von MCU ansehen. "switch" war mir bisher unbekannt, (homeassistant-Hilfsinfo => sollte man vermutlich ebenfalls einfach ignorieren) und mit "home_presence" kann ich noch nicht viel anfangen, ist evtl. ein hilfreicher Automatismus - oder eben auch nicht...




So, und hier im Vorgriff auch noch der modernisierte Code für die Erkennung des "besten Gateways":
sub identifyMyBestGW {
  my $name = shift;
  my $maxReadingsAge = shift // AttrVal($name,"maxReadingsAge",600);
 
  my $hash = $defs{$name};
  my @rssis = grep { $_ =~ /.*_rssi/ } sort keys %{ $hash->{READINGS} };
  my $bestGW = "unknown";
  my $bestGWold = ReadingsVal($name,"bestRecentGW","unknownGW");
  my $bestRSSI = -1000;
  my $currentRSSI = 0;
  for (@rssis) {
    if (ReadingsAge($name,$_,100) < $maxReadingsAge) {
      $currentRSSI = ReadingsVal($name,$_,-1100);
      if ($currentRSSI > $bestRSSI) {
        $bestRSSI = $currentRSSI ;
        $bestGW = $_;
      }
     
    }
  }
  $bestGW =~ s/_.*//g;
  return $bestGW ne $bestGWold ? $bestGW : undef;
}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors