FHEM Forum

FHEM - Hausautomations-Systeme => Zigbee => Thema gestartet von: holle75 am 05 März 2025, 10:16:29

Titel: zigbee2mqtt | "availability" anzeigen
Beitrag von: holle75 am 05 März 2025, 10:16:29
Hello, wie bekomme ich die "Availability" (online/offline) Informationen der Zigbee-Devices in fhem implementiert?

Der Grundaufbau funktioniert (was leichter war als gedacht), nur den Zustand der Geräte (availability online/offline) wie im Zigbee2mqtt Dashboard bekomme ich in fhem nicht ausgelesen.

Auch zeigt meine Zigbee Bridge den status

{"state":"online"}

anstatt online

Habe hier https://forum.fhem.de/index.php?topic=138681.msg1335838#msg1335838 in einem alten thread dazu was geschrieben.
Ich vermute einen Zusammenhang, da aber sehr frisch in der Zigbee-Materie, nicht wirklich eine Ahnung.

Edit: Im MQTT2 Server ist retain als standard ausgeschaltet. Laut z2m Doku ist availability eine Retain-Meldung. Zusammenhänge? Ich habe Retain mal angeschaltet, aber keine Änderung bemerkt.
Titel: Aw: zigbee2mqtt | "availability" anzeigen
Beitrag von: passibe am 05 März 2025, 12:38:16
In deine configuration.yaml folgendes reinschreiben:
availability:
  enabled: true

Ggfs. noch die timeouts anpassen (siehe hier (https://www.zigbee2mqtt.io/guide/configuration/device-availability.html)). Bei mir sieht das dann insgesamt so aus (weiß nicht, ob das überhaupt Sinn ergibt, habe es aber irgendwann mal so eingestellt und seitdem funktioniert es):
availability:
  enabled: true
  active:
    timeout: 90
  passive:
    timeout: 721

Dann noch die readingList jeweils um diese Zeile aus betateilchens Post (https://forum.fhem.de/index.php?topic=140307.msg1330288#msg1330288) erweitern bzw. einen vorhandenen Eintrag in der readingList für availability durch diese Zeile ersetzen:
$DEVICETOPIC/availability:.* { availability=>(json2nameValue($EVENT))->{state} }
Dann noch zigbee2mqtt neustarten und die Readings sollten auftauchen.

Ich glaube retain ist nur insofern relevant, dass der availability status nicht immer mit jeder Meldung des Devices von z2m "mitgeschickt" wird, sondern nur am Anfang beim hochfahren und dann nur bei tatsächlicher Änderung. Ich vermute, man bräuchte dann retain im Broker, um die Werte auch bei Kaltstart des empfangenden Systems dort reinzukriegen, ist bei FHEM aber mE irrelevant, weil ja ohnehin alles gespeichert wird. (Das jetzt alles aber nur große Vermutung meinerseits, ist kein sicheres Wissen.)
Titel: Aw: zigbee2mqtt | "availability" anzeigen
Beitrag von: holle75 am 05 März 2025, 13:04:39
hübsch und danke!

Nur mein

{"state":"online"}

bei der Bridge bleibt wie gehabt, obwohl der Code schon im Template implementiert war.

EDIT: mal das
$DEVICETOPIC/bridge/state:.* state
aus der ersten Zeile readingList des Templates rausgenommen. Dann passt das

EDIT2:
jetzt müsste man das availability nur noch ins devstateIcon einbinden. Aber da hört mein Verständnis auf. Beispiel Steckdose:

{my $light = FW_makeImage(ReadingsVal($name,'state','off')); my $current = ReadingsVal($name,'current',0); my $pwr = ReadingsVal($name,'power',0); my $voltage = ReadingsVal($name,'voltage',0); my $energy = ReadingsVal($name,'energy',0); qq(<div> <a href="/fhem?cmd.dummy=set $name toggle&XHR=1">$light</a> $current A - $pwr W - $voltage V - $energy Kwh<b></b>)}
Titel: Aw: zigbee2mqtt | "availability" anzeigen
Beitrag von: passibe am 05 März 2025, 15:44:42
Bei mir läuft das so (ist jetzt vielleicht alles nicht der schönste Code, aber tut was er soll):

Licht (dimmbar)
{
my $onl = ReadingsVal($name,"availability","offline") eq "online"?"10px-kreis-gruen":"10px-kreis-rot";
my $light = zigbee2mqtt_devStateIcon255($name);
$light =~ s/.*:([^:]+):.*/$1/;
"<div><a href=\"https://z2m.example.org/#/device/".AttrVal($name,"z2mUUID","none")."/exposes\" target=\"_blank\">".FW_makeImage($onl).'&nbsp;<a href="/fhem?cmd.dummy=set '.$name.' toggle&XHR=1">'.FW_makeImage($light)."</a></div>"
}

Steckdose (ohne Verbrauchsmessung):
{
my $onl = ReadingsVal($name,"availability","offline") eq "online"?"10px-kreis-gruen":"10px-kreis-rot";
my $socket = ReadingsVal($name,"state","undefined") eq "on"?"taster_ch_an_gruen":"taster_ch_aus_rot";
"<div><a href=\"https://z2m.example.org/#/device/".AttrVal($name,"z2mUUID","none")."/exposes\" target=\"_blank\">".FW_makeImage($onl).' <a href="/fhem?cmd.dummy=set '.$name.' toggle&XHR=1">'.FW_makeImage($socket)."</a><b></b>"
}

Steckdose (mit Verbrauchsmessung):
{
my $text = sprintf(" Aktuell: %.1f W – Gesamt: %.2f kWh", ReadingsVal($name,"power","-1"), ReadingsVal($name,"energy","-1"));
my $onl = ReadingsVal($name,"availability","offline") eq "online"?"10px-kreis-gruen":"10px-kreis-rot";
my $socket = ReadingsVal($name,"state","undefined") eq "on"?"taster_ch_an_gruen":"taster_ch_aus_rot";
"<div><a href=\"https://z2m.example.org/#/device/".AttrVal($name,"z2mUUID","none")."/exposes\" target=\"_blank\">".FW_makeImage($onl).' <a href="/fhem?cmd.dummy=set '.$name.' toggle&XHR=1">'.FW_makeImage($socket)."</a>&nbsp;$text<b></b>"
}

Bei mir hat zusätzlich jedes Gerät ein userattr z2mUUID. Dort setze ich die UUID des Geräts aus zigbee2mqtt ein. Mit dieser UUID erstellt devStateIcon dann unter dem 10-px-kreis einen Link, mit dem man dann direkt zur zigbee2mqtt-Seite des jeweiligen Geräts kommt. also z.B. https://z2m.example.org/#/device/0x00124b0024c2ab5c
Das ist natürlich optional, aber ich finde es ganz komfortabel, dann nicht immer die Geräte in zigbee2mqtt suchen zu müssen, sondern mich von FHEM aus direkt zum richtigen Gerät klicken zu können.

EDIT: Zur Bridge unter Version 2 hatte ich hier mal eine rudimentäre Konfiguration gepostet: https://forum.fhem.de/index.php?topic=140307.msg1333978#msg1333978
Titel: Aw: zigbee2mqtt | "availability" anzeigen
Beitrag von: holle75 am 05 März 2025, 18:13:48
Ah, sehr nett ... muss ich mal durchforsten.

Ich habe jetzt erstmal platt über alle Devices drübergebügelt:

define Zigbee_Batterieanzeige readingsGroup Zigbee.*:[Bb]attery
attr Zigbee_Batterieanzeige valueFormat {return "0" if( $VALUE eq "low" );; return "100" if( $VALUE eq "ok" );; return "25" if( $VALUE < 2.1 );; return "50" if( $VALUE < 2.3 );; return "75" if( $VALUE < 2.5 );; return "100"}
attr Zigbee_Batterieanzeige valueIcon {'battery.0' => 'measure_battery_0@red','battery.100' => 'measure_battery_100@green','Battery.0' => 'measure_battery_0@red','Battery.100' => 'measure_battery_100@green','batteryLevel.0' => 'measure_battery_0@red','batteryLevel.25' => 'measure_battery_25@red','batteryLevel.50' => 'measure_battery_50@orange','batteryLevel.75' => 'measure_battery_75@green','batteryLevel.100' => 'measure_battery_100@green','battery.charge.0' => 'measure_battery_0@red','battery.charge.25' => 'measure_battery_25@red','battery.charge.50' => 'measure_battery_50@orange','battery.charge.75' => 'measure_battery_75@green','battery.charge.100' => 'measure_battery_100@green'}


define Zigbee_Onlineanzeige readingsGroup Zigbee.*:availability
Titel: Aw: zigbee2mqtt | "availability" anzeigen
Beitrag von: holle75 am 05 März 2025, 18:32:17
Zitat von: passibe am 05 März 2025, 15:44:42Bei mir hat zusätzlich jedes Gerät ein userattr z2mUUID. Dort setze ich die UUID des Geräts aus zigbee2mqtt ein. Mit dieser UUID erstellt devStateIcon dann unter dem 10-px-kreis einen Link, mit dem man dann direkt zur zigbee2mqtt-Seite des jeweiligen Geräts kommt. also z.B. z2m.example.org/#/device/0x00124b0024c2ab5c


habe ich bei alten, nicht zigbee MQTT Devices über ein userReadings auch .... nur, wie bekommst du in das userReadings? die URL bei zigbee? Oder schreibst du die manuell rein? ... bzw wo finde ich die URL?

Edit_ ah, sorry, habs begriffen.
Titel: Aw: zigbee2mqtt | "availability" anzeigen
Beitrag von: passibe am 05 März 2025, 21:32:28
Ja, schreibe das manuell rein. Glaube nicht, dass es eine Möglichkeit gibt, das von z2m automatisch befüllen zu lassen.
Titel: Aw: zigbee2mqtt | "availability" anzeigen
Beitrag von: holle75 am 09 März 2025, 11:49:29
muss doch nochmal nachhaken.

Ich bekomme (nur bei der Bridge) mit obiger Änderung jetzt zwar im status die Info aus "availability" angezeigt, aber das RAEDING an sich nicht. Das im Status ist prima, trotzdem hätte ich das Reading auch gerne. Das ist template "zigbee2mqtt_bridge"

ReadingList sieht so aus (ich habe nur "$DEVICETOPIC/bridge/state:.* state" in der ersten Zeile entfernt um das "{"state":"online"}" im state loszuwerden)

$DEVICETOPIC/bridge/config/devices:.* {}
  $DEVICETOPIC/bridge/config/log_level:.* log_level
  $DEVICETOPIC/bridge/config/permit_join:.* permit_join
  $DEVICETOPIC/bridge/config/rename:.* { json2nameValue($EVENT, 'rename_') }
  $DEVICETOPIC/bridge/config:.* { json2nameValue($EVENT) }
  $DEVICETOPIC/bridge/log:.*\"type\".\"devices\".\"message\".* devices
  $DEVICETOPIC/bridge/log:.* log
  $DEVICETOPIC/bridge/logging:.* { json2nameValue($EVENT,'log_') }
  $DEVICETOPIC/bridge/response/networkmap:.* { my $type = $EVENT =~ m/.*,"type":"(raw|graphviz)",.*/ ? $1 : 'networkmap'; $EVENT =~ m/{"data":\{.*"value":"?(.*[^"])"?\},"status":"ok"\}/ ? { $type=>$1 } : {} }
  $DEVICETOPIC/bridge/devices:.* devices
  $DEVICETOPIC/bridge/info:.* info
  $DEVICETOPIC/bridge/groups:.* groups
  $DEVICETOPIC/bridge/event:.* { json2nameValue($EVENT) }
  $DEVICETOPIC/bridge/extensions:.* extensions
  $DEVICETOPIC/bridge/response/permit_join:.* { json2nameValue($EVENT) }
  $DEVICETOPIC/bridge/definitions:.* {}
  $DEVICETOPIC/availability:.* { availability=>(json2nameValue($EVENT))->{state} }
zigbee_zh:zigbee2mqtt/bridge/response/restart:.* { json2nameValue($EVENT) }
zigbee_zh:zigbee2mqtt/bridge/converters:.* converters
zigbee_zh:zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }
zigbee_zh:zigbee2mqtt/bridge/response/device/rename:.* { json2nameValue($EVENT) }
Titel: Aw: zigbee2mqtt | "availability" anzeigen
Beitrag von: passibe am 10 März 2025, 12:07:00
Das template ist leider veraltet, mit v2 hat sich bei der Bridge einiges geändert.

Hatte deshalb hier (https://forum.fhem.de/index.php?topic=140307.msg1333978#msg1333978) mal eine rudimentäre Konfiguration gepostet, die aber außer permit_join, device_remove und device_rename nix kann. (Mir reicht das aber, alles andere kann ich über das GUI machen.)

Lösch mal deine readingList (und setList) und konfigurier das Schritt für Schritt neu mit dem Zeug aus meinem Beispiel und ggfs. der Dokumentation (https://www.zigbee2mqtt.io/guide/usage/mqtt_topics_and_messages.html#zigbee2mqtt-bridge-info), falls du weitere Funktionen brauchst.

Wenn du das in availability statt state haben willst, dann einfach:
$DEVICETOPIC/bridge/state:.* { availability=>(json2nameValue($EVENT))->{state} }
Wenn du das sowohl in availability als auch in state haben willst, dann in der readingList:
$DEVICETOPIC/bridge/state:.* { state=>(json2nameValue($EVENT))->{state} }und dann noch ein userReading:
availability:(online|offline) {return ReadingsVal($NAME,"state","offline")}
Titel: Aw: zigbee2mqtt | "availability" anzeigen
Beitrag von: holle75 am 10 März 2025, 12:58:14
Danke!

mit nur

$DEVICETOPIC/bridge/state:.* { availability=>(json2nameValue($EVENT))->{state} }
also komplett in in readingList

$DEVICETOPIC/bridge/config/devices:.* {}\
  $DEVICETOPIC/bridge/config/log_level:.* log_level\
  $DEVICETOPIC/bridge/config/permit_join:.* permit_join\
  $DEVICETOPIC/bridge/config/rename:.* { json2nameValue($EVENT, 'rename_') }\
  $DEVICETOPIC/bridge/config:.* { json2nameValue($EVENT) }\
  $DEVICETOPIC/bridge/log:.*\"type\".\"devices\".\"message\".* devices\
  $DEVICETOPIC/bridge/log:.* log\
  $DEVICETOPIC/bridge/logging:.* { json2nameValue($EVENT,'log_') }\
  $DEVICETOPIC/bridge/response/networkmap:.* { my $type = $EVENT =~ m/.*,"type":"(raw|graphviz)",.*/ ? $1 : 'networkmap';; $EVENT =~ m/{"data":\{.*"value":"?(.*[^"])"?\},"status":"ok"\}/ ? { $type=>$1 } : {} }\
  $DEVICETOPIC/bridge/devices:.* devices\
  $DEVICETOPIC/bridge/info:.* info\
  $DEVICETOPIC/bridge/groups:.* groups\
  $DEVICETOPIC/bridge/event:.* { json2nameValue($EVENT) }\
  $DEVICETOPIC/bridge/extensions:.* extensions\
  $DEVICETOPIC/bridge/response/permit_join:.* { json2nameValue($EVENT) }\
  $DEVICETOPIC/bridge/definitions:.* {}\
  $DEVICETOPIC/bridge/state:.* { availability=>(json2nameValue($EVENT))->{state} }\
zigbee_zh:zigbee2mqtt/bridge/response/restart:.* { json2nameValue($EVENT) }\
zigbee_zh:zigbee2mqtt/bridge/converters:.* converters\
zigbee_zh:zigbee2mqtt/bridge/state:.* { json2nameValue($EVENT) }\
zigbee_zh:zigbee2mqtt/bridge/response/device/rename:.* { json2nameValue($EVENT) }

bekomme ich online/offline sowohl in state als auch als einzelnes Reading. Das ist schön so.
Da ich diese Bridge an sich recht wenig verstehe (besonders die Readings die da generiert werden), lasse ich ansonsten lieber die Finger davon so lange sie funktioniert. Will sagen, selbst wenn ich mich jetzt in dein Template (und evtl Doku) einarbeite wird da nix sinnvolles/umfassendes rauskommen.