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
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
Schau doch mal hier , von Zwiebel.
da gibt es doch einige Beispiele wie man das löst
https://forum.fhem.de/index.php/topic,65219.msg901758.html#msg901758 (https://forum.fhem.de/index.php/topic,65219.msg901758.html#msg901758)
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
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
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
Da fehlt ganz am Ende der myUtils ein 1;
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
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.
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
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
Da fehlt ein $ bei
sub UDP_Msg($$)
Verbessern und reload wiederholen.
Dein UDP_MSG nimmt/will nur 2 Parameter du übergibst aber immer 3 Parameter...
(steht ja auch so in der Fehlermeldung ;) )
Gruß, Joachim
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!!!
Für jeden "Dollar" einen Parameter... ;)
EDIT: dann kannst du ja [gelöst] vor den 1. Beitrag setzen...
Gruß, Joachim
OK, habe ich mir gemerkt :-)
Eine Frage habe ich noch. Jetzt überträgt er die beiden Werte immer wenn der Schalter An/Aus geschaltet
wird bzw. wenn neue Werte reinkommen.
Das dumme ist nun, dass er die Werte beim Ein/Ausschalten mit 0/-1 überschreibt da er in dem Moment
ja keine neuen Werte hat. Kann ich das so umformulieren, dass er die Werte nur dann überträgt wenn
sie > 15 sind? Müsste sowohl für Humidity als auch für Temperature funktionieren da der Raum immer konstant warm ist.
Gruß,
Claus
Bin nicht sicher, ob ich das jetzt alles verstanden hab (du hast ja die Notify noch nicht gepostet)...
Du kannst event-on-change-reading mit Threshold nutzen...
Du kannst "spezifischere" Notify machen (Vermutung, weil ich die/das aktuelle Notify nicht kenne)...
Du kannst auch if-Abfragen etc. in deine Sendefunktionen einbauen...
Und vermutlich weitere Möglichkeiten... ;)
Gruß, Joachim
Die Notify sieht so aus:
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:
Da die Übertragung nur beim An/Ausschalten die Werte zerschießt würde es wohl genügen,
das so anzupassen, dass da keine Werte übertragen werden.
Du musst Dir wirklich angewöhnen uns alles wichtige zu geben. Diese ich Wert Dir mal was hin Masche ist anstrengend. Und bitte immer in Codetags alles setzen was Code, list,Log und so ist.
So und damit wir jetzt mal alles zusammen haben üben wir das jetzt.
Eine Nachricht, da schreibst du Dein Anliegen rein, was Du erwartest und was tatsächlich passiert.
Darunter ein list aller Beteiligten Devices und Deine 99_myUtils
Notify
Sonoff Taster Schalter was auch immer
Bitte code-Tags!
Das Notify reagiert auf ALLES wo "temperature" vorkommt...
...und zwar EGAL von welchem Device!
Sowas solltest du nicht machen...
Das Notify hat aber nichts mit On/Off zu tun...
Du hast doch sicher weitere Notify!?
Ich würde EIN Notify machen und dann EINE Sub aufrufen und DORT "schauen" WELCHES Reading sich geändert hat und NUR DAS auch an Loxone schicken...
Aber jeder wie er kann...
Gruß, Joachim
Danke für Eure Hinweise, ich lese mich mal die die Thematik
Notify ein und probiere das mal selbst zu lösen.
Danke nochmal für Eure Hilfe!
Gruß,
Claus
Hallo Claus,
bevor Du Dich beim Lesen verirrst :)
https://commandref.fhem.de/#notify
https://wiki.fhem.de/wiki/Notify
Gruß Otto