[gelöst] Wert in einem Device von Readings auf Internal Wert mappen

Begonnen von Claus1985, 23 Juni 2019, 19:47:49

Vorheriges Thema - Nächstes Thema

Claus1985

Hi Zusammen,

bin neu in FHEM und versuche gerade folgendes zu machen:

Ich habe ein Gerät (Sonoff TH10 mit AM2301 Sensor) in FHEM eingebunden.
FHEM bekommt auch alle readings bei Änderung autom. mit das funktioniert einwandfrei.

Nun möchte ich den Temperatur- und Luftfeuchtigkeitswert per UDP an
Loxone übermitteln. Die Werte kommen leider nicht im Loxone an.

Wenn ich das richtig interpretiere, ist das Problem, dass die Werte in FHEM als Reading
(sensor-am2301-humidity und sensor-am2301-temperature) und nicht als internal
Wert für Temperatur und Luftfeuchtigkeit des Gerätes erkannt werden.

Ich konnte die Werte zwar über eine readingsGroup in FHEM rausfischen,
kriege das jedoch (da es ja kein Device ist) nicht an Loxone übertragen.

Nun meine Frage: Wie kann ich die Werte von den Readings des Devices
(sensor-am2301-humidity und sensor-am2301-temperature) auf die internal Werte
temperature und humidtiy des Devices mappen?

Danke Euch vielmals!

Gruß,

Claus

Otto123

Hallo Claus,

tut mir leid aber ich verstehe das Problem nicht. Kannst Du bitte den Code zeigen?
ZitatNun möchte ich den Temperatur- und Luftfeuchtigkeitswert per UDP an
Loxone übermitteln. Die Werte kommen leider nicht im Loxone an.

Hier findest Du in der Doku die Funktionen mit denen Du auf Readings und Internals zugreifen kannst.
https://commandref.fhem.de/commandref_DE.html#perl

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

LuckyDay


Claus1985

Hi Zusammen,

vielen Dank für die schnellen Antworten. Anbei ein Screenshot vom Device.
Ich möchte diesen fertigen Programmbaustein (von meintechblog.com) nutzen
um das an Loxone zu senden:

#TempHumidityToLoxone
sub TempHumidityToLoxone($)
{
my ($device) = @_;
my $temperature=ReadingsVal("$device","temperature","-1");
my $humidity=ReadingsVal("$device","humidity","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $temperature $humidity");
}


Nun greift der ja auf die Werte temperature und humidity zu vom jeweiligen Device.
In dem von mir angelegten Device sind die Werte so aber nicht belegt sondern
eben in den Readings über den Sensor enthalten. Wie kriege ich die
(sensor-am2301-humidity und sensor-am2301-temperature) nun in die "richtigen"
Werte bzw. wie kann ich den Code abändern damit er die Readings verwendet statt
den Standard Werten?

Danke Euch!

Gruß,

Claus

MadMax-FHEM

ReadingsVal liest (wie der Name sagt) Werte von Readings eines Devices...

ReadingsVal("DeviceName","ReadingName","Ersatzwert")

Du musst doch nur die ReadingNamen an die deines Sensors anpassen...

Leider hast du einen Screenshot statt ein list gepostet, sonst hätte ich dir per copy/paste auch die Anpassung schreiben können...

Zum Abschreiben von einem Bild habe ich mit dem Mobiltelefon keine Lust... ;)


Was du noch brauchst ist irgendwas, was die Funktion aufruft und den DeviceNamen übergibt...

Z.B. ein Notify was auf die Readings für Luftfeuchte/Temperatur deines Sensors reagiert...

Und wieder: hättest du ein list gepostet, hätte ich auch das gebastelt aber das Abtippen von einem Bild mit dem Handy ist kein Spaß, leider...

EDIT: alternativ (und die korrekte Antwort auf deine Frage / aber unnötig umständlich) kannst du auch ein userReadings anlegen, wo es dann eben Readings gibt, die "humidity" und "temperature" heißen und Kopien der vorhandenen Werte enthalten... https://wiki.fhem.de/wiki/UserReadings

EDIT2: was ich nicht weiß, ist ob die Funktion UDP_Msg in fhem "einfach so" da ist oder ob du ein zusätzliches Perl-Paket brauchst (und wenn: welches)... Aber das scheint wohl zu gehen...

EDIT3: Glück gehabt, du hast die Readingnamen zumindest im Text... Daher:


#TempHumidityToLoxone
sub TempHumidityToLoxone($)
{
my ($device) = @_;
my $temperature=ReadingsVal("$device","sensor-am2301-temperature","-1");
my $humidity=ReadingsVal("$device","sensor-am2301-humidity","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $temperature $humidity");
}


Das Notify könnte so sein...


define nToLoxone notify HWR_Licht:(sensor-am2301-humidity|sensor-am2301-temperature).* {TempHumidityToLoxone($NAME)}


Allerdings werden so immer beide Werte übermittelt, selbst wenn sich nur einer geändert hat...
...aber so ist es wohl "designed"...

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)

Claus1985

Hi Joachim,

vielen, vielen Dank für Deine schnelle und ausführliche Antwort!

Ich habe mir nun nochmal die Log Datei angesehen. Dabei ist mir aufgefallen,
dass FHEM die Readings zwar alle Empfängt und beim An/Ausschalten der Lampe
auch einen Code ausführt, dieser jedoch mit Error endet:

2019-06-24 18:34:31 TASMOTA_DEVICE HWR_Licht result-power: OFF
2019-06-24 18:34:31 MQTT_DEVICE HWR_Deckenlicht_TH10 OFF
2019.06.24 18:34:31 1 : ERROR evaluating my $TYPE='TASMOTA_DEVICE';my $NAME='HWR_Licht';my $EVENT='off';my $EVTPART0='off';my $SELF='OnOffToLoxone';{OnOffToLoxone("$NAME")}: Undefined subroutine &main::OnOffToLoxone called at (eval 593) line 1.
2019-06-24 18:34:31 TASMOTA_DEVICE HWR_Licht off

Bei einem Statusupdate also wenn neue Readings des Gerätes reinkommen löst
FHEM keine UDP Nachricht aus und es gibt auch keinen Error:

2019-06-24 18:35:27 MQTT Mosquitto connection: active
2019-06-24 18:36:13 MQTT_DEVICE HWR_Deckenlicht_TH10 status: {"Time":"2019-06-24T17:36:12","Uptime":"0T20:15:20","Vcc":3.180,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"POWER":"OFF","Wifi":{"AP":1,"SSId":"XXX","BSSId":"XXX","Channel":X,"RSSI":100,"LinkCount":1,"Downtime":"0T00:00:10"}}
2019-06-24 18:36:13 TASMOTA_DEVICE HWR_Licht state-uptime: 0T20:15:20
2019-06-24 18:36:13 TASMOTA_DEVICE HWR_Licht state-vcc: 3.18
2019-06-24 18:36:13 TASMOTA_DEVICE HWR_Licht state-time: 2019-06-24T17:36:12
2019-06-24 18:36:13 TASMOTA_DEVICE HWR_Licht sensor-am2301-temperature: 29.1
2019-06-24 18:36:13 TASMOTA_DEVICE HWR_Licht sensor-time: 2019-06-24T17:36:12

Habe ich das richtig verstanden, dass dafür das Notify gedacht ist? Das habe ich zwar eingefügt (siehe Anhang),
jedoch bleibt das ohne Auswirkungen.

Der Code in meiner 99_myUtils entspricht dabei dem Standard den ich in den Online-Tutorials
gefunden habe (inkl. Deiner Ergänzung):

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
##############################################
#UDP Befehle senden
sub UDP_Msg($$)
{
my ($dest,$port,$cmd) = @_;
my $sock = IO::Socket::INET->new(
Proto => 'udp',
PeerPort => $port,
PeerAddr => $dest
) or die "Could not create socket: $!\n";
$sock->send($cmd) or die "Send error: $!\n";
return "send $cmd";
}

#OnOffToLoxone
#device:
#1 state(0,1)
#2 pct(0-100)

#TempHumidityToLoxone
sub TempHumidityToLoxone($)
{
my ($device) = @_;
my $temperature=ReadingsVal("$device","sensor-am2301-temperature","-1");
my $humidity=ReadingsVal("$device","sensor-am2301-humidity","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $temperature $humidity");
}

sub OnOffToLoxone($)
{
my ($device) = @_;
my $state = ReadingsVal("$device","state","-1");
if ($state eq "on") {
$state = "1";
}
if ($state eq "off") {
$state = "0";
}
my $pct = ReadingsVal("$device","pct","-1");
#fhem("set $device: $state $pct");
UDP_Msg("192.168.178.77" , "7000" , "$device: $state $pct");
}
#OpenClosedToLoxone
#device
#1 state(0,1)
#2 alive(1-0)
#3 battery(0,1)
sub OpenClosedToLoxone($)
{
my ($device) = @_;
my $state = ReadingsVal("$device","state","-1");
if ($state eq "closed") {
$state = "0";
}
if ($state eq "open") {
$state = "1";
}
if ($state eq "tilted") {
$state = "2";
}
my $alive = ReadingsVal("$device","alive","-1");
if ($alive eq "yes") {
$alive = "1";
}
if ($alive eq "no") {
$alive = "0";
}
my $battery = ReadingsVal("$device","battery","-1");
if ($battery eq "ok") {
$battery = "1";
}
if ($battery eq "low") {
$battery = "0";
}
my $sabotage = ReadingsVal("$device","sabotageError","-1");
if ($sabotage eq "on") {
$sabotage = "1";
}
if ($sabotage eq "off") {
$sabotage = "0";
}
UDP_Msg("192.168.178.77" , "7000" , "$device: $state $alive $battery $sabotage");
}
#ClimateToLoxone
#device:
#1 measured-temp
#2 humidity
#3 alive
#4 battery
#5 desired-temp
#6 controlMode
#7 dewpoint
sub ClimateToLoxone($)
{
my ($device) = @_;
my $measuredTemp=ReadingsVal("$device","measured-temp","-1");
my $humidity=ReadingsVal("$device","humidity","-1");
my $alive = ReadingsVal("$device","alive","-1");
if ($alive eq "yes") {
$alive = "1";
}
if ($alive eq "no") {
$alive = "0";
}
my $battery = ReadingsVal("$device","battery","-1");
if ($battery eq "ok") {
$battery = "1";
}
if ($battery eq "low") {
$battery = "0";
}
my $desiredTemp=ReadingsVal("$device","desired-temp","-1");
my $controlMode=ReadingsVal("$device","controlMode","-1");
if ($controlMode eq "manual") {
$controlMode = "0";
}
if ($controlMode eq "auto") {
$controlMode = "1";
}
my $dewpoint=ReadingsVal("$device","dewpoint","-1");
my $actuator=ReadingsVal("$device","actuator","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $measuredTemp $humidity $alive $battery $desiredTemp $controlMode $dewpoint $actuator");
}
#EnergyToLoxone
sub EnergyToLoxone($)
{
my ($device) = @_;
my $energy=ReadingsVal("$device","sensor3","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $energy");
}
#Energy2ToLoxone
sub Energy2ToLoxone($)
{
my ($device) = @_;
my $energy=ReadingsVal("$device","current","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $energy");
}
#MotionToLoxone
sub MotionToLoxone($)
{
my ($device) = @_;
my $motion=ReadingsVal("$device","motion","-1");
if ($motion eq "on (to HMLAN1)") {
$motion = "1";
}
UDP_Msg("192.168.178.77" , "7000" , "$device: $motion");
}


Hast Du eine Idee woran das liegt und wie ich das Reading bei Aktualisierung doch weitergeben kann?
Den Error beim Versuch die Status ON/OFF UDP an Loxone zu übertragen kann ich mir auch nicht erklären.
Hast Du eine Idee woran das liegen könnte?

Danke Dir!

Gruß,

Claus

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Claus1985

Danke für die Hinweis, habe ich ergänzt!
Hat doch etwas genutzt! Nun führt er das Skript aus, bringt aber eine Fehlermeldung:

2019-06-24 20:11:13 readingsGroup Wetter HWR_Licht.sensor-am2301-humidity: 49.3
2019.06.24 20:11:13 1 : ERROR evaluating my $EVTPART0='sensor-am2301-humidity:';my $SELF='nToLoxone';my $TYPE='TASMOTA_DEVICE';my $NAME='HWR_Licht';my $EVTPART1='49.3';my $EVENT='sensor-am2301-humidity: 49.3';{TempHumidityToLoxone($NAME)}: Undefined subroutine &main::TempHumidityToLoxone called at (eval 685) line 1.

Die bringt er bei allen Statusänderungen (auch bei Bewegung von Bewegungsmeldern):
2019-06-24 20:13:42 HUEDevice Bewegungsmelder_Bad_OG motion
2019-06-24 20:13:57 HUEDevice Bewegungsmelder_Bad_OG nomotion
2019.06.24 20:13:58 1 : ERROR evaluating my $SELF='MotionToLoxone';my $EVTPART0='motion';my $EVENT='motion';my $NAME='Bewegungsmelder_Bad_OG';my $TYPE='HUEDevice';{MotionToLoxone("$NAME")}: Undefined subroutine &main::MotionToLoxone called at (eval 689) line 1.

Hat jemand von Euch eine Idee was diese Meldung bedeutet bzw. wo der Fehler liegt?

Gruß,

Claus

CoolTux

Code und Logausgaben in Codetags bitte.

In FHEMWEB gibst Du bitte oben in der Kommandozeile ein
reload 99_myUtils

Danach schaust Du im FHEM Log nach den letzten Zeilen und postest sie hier.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

MadMax-FHEM

Dann poste doch (sicherheitshalber) noch mal den jetzigen Inhalt der myUtils-Datei...

Ebenso die verwendeten Notify (list NotifyName und dann hier posten)...

Und: wie heißt die "utils-Datei"!?

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)

Claus1985

Habe nun das Reload my Utils ausgeführt. Folgende Fehlermeldungen bringt er:

Too many arguments for main::UDP_Msg at ./FHEM/99_myUtils.pm line 41, near ""$device: $temperature $humidity")"
Too many arguments for main::UDP_Msg at ./FHEM/99_myUtils.pm line 60, near ""$device: $state $pct")"
Too many arguments for main::UDP_Msg at ./FHEM/99_myUtils.pm line 101, near ""$device: $state $alive $battery $sabotage")"
Too many arguments for main::UDP_Msg at ./FHEM/99_myUtils.pm line 141, near ""$device: $measuredTemp $humidity $alive $battery $desiredTemp $controlMode $dewpoint $actuator")"
Too many arguments for main::UDP_Msg at ./FHEM/99_myUtils.pm line 148, near ""$device: $energy")"
Too many arguments for main::UDP_Msg at ./FHEM/99_myUtils.pm line 155, near ""$device: $energy")"
Too many arguments for main::UDP_Msg at ./FHEM/99_myUtils.pm line 165, near ""$device: $motion")"

Code in my Utils (heißt 99_myUtils.pm) ist:

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
##############################################

#UDP Befehle senden
sub UDP_Msg($$)
{
my ($dest,$port,$cmd) = @_;
my $sock = IO::Socket::INET->new(
Proto => 'udp',
PeerPort => $port,
PeerAddr => $dest
) or die "Could not create socket: $!\n";
$sock->send($cmd) or die "Send error: $!\n";
return "send $cmd";
}

#TempHumidityToLoxone
sub TempHumidityToLoxone($)
{
my ($device) = @_;
my $temperature = ReadingsVal("$device","sensor-am2301-temperature","-1");
my $humidity = ReadingsVal("$device","sensor-am2301-humidity","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $temperature $humidity");
}

#OnOffToLoxone
#device:
#1 state(0,1)
#2 pct(0-100)
sub OnOffToLoxone($)
{
my ($device) = @_;
my $state = ReadingsVal("$device","state","-1");
if ($state eq "on") {
$state = "1";
}
if ($state eq "off") {
$state = "0";
}
my $pct = ReadingsVal("$device","pct","-1");
#fhem("set $device: $state $pct");
UDP_Msg("192.168.178.77" , "7000" , "$device: $state $pct");
}
#OpenClosedToLoxone
#device
#1 state(0,1)
#2 alive(1-0)
#3 battery(0,1)
sub OpenClosedToLoxone($)
{
my ($device) = @_;
my $state = ReadingsVal("$device","state","-1");
if ($state eq "closed") {
$state = "0";
}
if ($state eq "open") {
$state = "1";
}
if ($state eq "tilted") {
$state = "2";
}
my $alive = ReadingsVal("$device","alive","-1");
if ($alive eq "yes") {
$alive = "1";
}
if ($alive eq "no") {
$alive = "0";
}
my $battery = ReadingsVal("$device","battery","-1");
if ($battery eq "ok") {
$battery = "1";
}
if ($battery eq "low") {
$battery = "0";
}
my $sabotage = ReadingsVal("$device","sabotageError","-1");
if ($sabotage eq "on") {
$sabotage = "1";
}
if ($sabotage eq "off") {
$sabotage = "0";
}
UDP_Msg("192.168.178.77" , "7000" , "$device: $state $alive $battery $sabotage");
}
#ClimateToLoxone
#device:
#1 measured-temp
#2 humidity
#3 alive
#4 battery
#5 desired-temp
#6 controlMode
#7 dewpoint
sub ClimateToLoxone($)
{
my ($device) = @_;
my $measuredTemp=ReadingsVal("$device","measured-temp","-1");
my $humidity=ReadingsVal("$device","humidity","-1");
my $alive = ReadingsVal("$device","alive","-1");
if ($alive eq "yes") {
$alive = "1";
}
if ($alive eq "no") {
$alive = "0";
}
my $battery = ReadingsVal("$device","battery","-1");
if ($battery eq "ok") {
$battery = "1";
}
if ($battery eq "low") {
$battery = "0";
}
my $desiredTemp=ReadingsVal("$device","desired-temp","-1");
my $controlMode=ReadingsVal("$device","controlMode","-1");
if ($controlMode eq "manual") {
$controlMode = "0";
}
if ($controlMode eq "auto") {
$controlMode = "1";
}
my $dewpoint=ReadingsVal("$device","dewpoint","-1");
my $actuator=ReadingsVal("$device","actuator","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $measuredTemp $humidity $alive $battery $desiredTemp $controlMode $dewpoint $actuator");
}
#EnergyToLoxone
sub EnergyToLoxone($)
{
my ($device) = @_;
my $energy=ReadingsVal("$device","sensor3","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $energy");
}
#Energy2ToLoxone
sub Energy2ToLoxone($)
{
my ($device) = @_;
my $energy=ReadingsVal("$device","current","-1");
UDP_Msg("192.168.178.77" , "7000" , "$device: $energy");
}
#MotionToLoxone
sub MotionToLoxone($)
{
my ($device) = @_;
my $motion=ReadingsVal("$device","motion","-1");
if ($motion eq "on (to HMLAN1)") {
$motion = "1";
}
UDP_Msg("192.168.178.77" , "7000" , "$device: $motion");
}
1;


Das List Notify hat folgendes ergeben:

Internals:
   DEF        .*:temperature.* {TempHumidityToLoxone("$NAME")}
   FUUID      5cf7dd63-f33f-a40a-b2ee-46975e68230415f8
   NAME       TempHumidityToLoxone
   NR         50
   NTFY_ORDER 50-TempHumidityToLoxone
   REGEXP     .*:temperature.*
   STATE      2019-06-24 18:01:13
   TRIGGERTIME 1561392073.11242
   TYPE       notify
   READINGS:
     2019-06-23 18:04:21   state           active
Attributes:

Gruß,

Claus

CoolTux

Da fehlt ein $ bei
sub UDP_Msg($$)

Verbessern und reload wiederholen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

MadMax-FHEM

Dein UDP_MSG nimmt/will nur 2 Parameter du übergibst aber immer 3 Parameter...

(steht ja auch so in der Fehlermeldung ;)  )

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)

Claus1985

Argh, das war echt einfach...
Nachdem ich das $ hinzugefügt habe funktioniert der Reload ohne jegliche Meldungen.
Die Infos werden nun wie gedacht an Loxone übertragen.
Steht das $ für die Anzahl an max. zu übergebenden Argumenten?

Danke Euch!!!

MadMax-FHEM

Für jeden "Dollar" einen Parameter... ;)

EDIT: dann kannst du ja [gelöst] vor den 1. Beitrag setzen...

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)