Hallo Gemeinde,
ich habe unter FHEM den MQTT2 Server installiert und diverse Shelly angebunden. Die Geräte sind auch artig erschienen und lassen sich steuern.
Was mich gerade umtreibt, ist das Logging / die Erzeugung von Events.
Das Setzen von "event-on-change-reading = 1" blockiert offenbar Alle!!! events des Gerätes unabhängig ob sie sich ändern oder nicht.
Zumindest sieht das im Eventlog so aus und in der DBLOG Datenbank erscheinen auch keine Einträge.
Setze ich event-on-change-reading = 0 werden fröhlich die Events für alle Readings erzeugt. Geloggt sollen laut globaler Definition in DBLOG (von diesen) nur "power" und "temperature".
Allerdings werden 7 Events mit Power zur gleichen Zeit (Sekunde) erzeugt. Von Temperature sehe ich wiederum nix ;-)
3 Fragen:
- wie kann ich das Logging nur auf "Power" fokussieren?
- lässt sich der zeitliche Abstand der geloggten Power-Events definieren (event-min-interval zeigte irgendwie auch keine Wirkung)
- könnt Ihr die Ursache für die 7 Events von Power ausmachen?
Hier noch das Listing des Gerätes:
CHANGED
CID shelly1pm_005C4C
DEF shelly1pm_005C4C
DEVICETOPIC Bad_Luefter
FUUID 5dff80f8-f33f-47a1-72aa-ba7c18448a7415d8
IODev MQTT2_FHEM_Server
LASTInputDev MQTT2_FHEM_Server
MQTT2_FHEM_Server_MSGCNT 364
MQTT2_FHEM_Server_TIME 2019-12-26 14:57:46
MSGCNT 364
NAME Bad_Luefter
NR 609
STATE off
TYPE MQTT2_DEVICE
Helper:
DBLOG:
power:
DBLOG:
TIME 1577368246.33139
VALUE 0.00
temperature:
DBLOG:
TIME 1577368246.30895
VALUE 35.16
temperature_f:
DBLOG:
TIME 1577368246.32015
VALUE 95.29
READINGS:
2019-12-26 14:28:46 fw_ver 20191216-090602/v1.5.7@c30657ba
2019-12-26 14:28:46 id shelly1pm-005C4C
2019-12-26 14:57:46 input0 0
2019-12-26 14:28:46 ip 192.168.200.33
2019-12-26 14:28:46 mac 2462AB005C4C
2019-12-26 14:28:46 new_fw false
2019-12-26 14:28:46 online true
2019-12-26 14:57:46 overtemperature 0
2019-12-26 14:57:46 power 0.00
2019-12-26 14:57:46 relay0 off
2019-12-26 13:44:57 relay_0_energy 5490
2019-12-26 13:44:57 relay_0_kWh 0.09
2019-12-26 14:57:46 relay_0_power 0.00
2019-12-26 14:57:46 state off
2019-12-26 14:57:46 temperature 34.95
2019-12-26 14:57:46 temperature_f 94.91
Attributes:
IODev MQTT2_FHEM_Server
alias Bad Lüfter
comment To get appropriate loadState values: Change the default limit "100" in readingList to your needs.
devStateIcon {my $onl = ReadingsVal($name,"online","false") eq "true"?"10px-kreis-gruen":"10px-kreis-rot";; my $light = ReadingsVal($name,"state","off");; my $cons = ReadingsVal($name,"relay_0_power","unknown");; my $temp = ReadingsVal($name,"temperature","-100");;"<div><a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a> Aktuell: $cons W / Temp.: $temp °C</div>"}
event-on-change-reading 1
model shelly1_w_energy_meassuring
readingList shellies/shelly1pm-005C4C/relay/0:.* state
shellies/shelly1pm-005C4C/relay/0:.* relay0
shellies/shelly1pm-005C4C/input/0:.* input0
shellies/shelly1pm-005C4C/online:.* online
shellies/announce:.* { $EVENT =~ m,..id...shelly1pm-005C4C...mac.*, ? json2nameValue($EVENT) : undef }
shellies/shelly1pm-005C4C/announce:.* { json2nameValue($EVENT) }
shellies/shelly1pm-005C4C/relay/0/power:.* relay_0_power
shellies/shelly1pm-005C4C/relay/0/power:.* { my $compare = $EVTPART0 < 100 ? "off":"on"; ReadingsVal($NAME,"loadState","off") ne $compare ? { 'loadState' => $compare } : undef }
shellies/shelly1pm-005C4C/temperature:.* temperature
shellies/shelly1pm-005C4C/overtemperature:.* overtemperature
shellies/shelly1pm-005C4C/relay/0/energy:.* relay_0_energy
shellies/shelly1pm-005C4C/relay/0/energy:.* {'relay_0_kWh' => sprintf("%.2f",$EVENT/60/1000)}
shellies/shelly1pm-005C4C/longpush/0:.* longpush_0
shelly1pm_005C4C:shellies/shelly1pm-005C4C/temperature_f:.* temperature_f
room Bad,MQTT
setList relay0:on,off,toggle shellies/shelly1pm-005C4C/relay/0/command $EVTPART1
off:noArg shellies/shelly1pm-005C4C/relay/0/command off
on:noArg shellies/shelly1pm-005C4C/relay/0/command on
x_update:noArg shellies/shelly1pm-005C4C/command update_fw
x_mqttcom shellies/shelly1pm-005C4C/command $EVTPART1
userReadings power { ((ReadingsVal("Bad_Luefter","relay_0_power",0))) }
webCmd :
Schonmal vorab vielen Dank für Antworten.
Grüße aus Leipzig
//Erik
Hallo Erik,
der hier "event-on-change-reading = 1" ist der Klassiker. Wie kommst Du auf den Syntax?
ich weiß schon: Nichts eintragen und einfach vorn auf attr drücken: Blöder Automatismus von FHEM 🎅🎄
Du musst es so machen - Zitat Doku:
Zitatevent-on-change-reading
Dieses Attribut enthält eine durch Kommata getrennte Liste von "readings". Wenn gesetzt, erzeugen nur Veränderungen der gelisteten "readings" ein Ereignis. Wenn die aktualiserten Werte der gelisteten "readings" identisch sind, wird kein Ereignis generiert.
Wenn hinter dem Namen eines "readings" eine :Schwelle angegeben ist, wird das Event nur getriggert wenn die Änderung grösser als diese Schwelle ist.
Die unterschiedlichen Bedeutungen von event-on-update-reading und event-on-change-reading sind folgende:
Wenn beide Attribute nicht gesetzt sind erzeugt jede Aktualisierung eines jeden "readings" eines Gerätes ein Ereignis.
Wenn eines der Attribute gesetzt ist, erzeugen nur Updates oder änderungen von "readings" die in einem der Attribute gesetzt sind ein Ereignis.
Wenn ein "reading" in event-on-update-reading aufgeführt ist, erzeugt eine Aktualisierung ein Ereignis unabhängig ob das "reading" auch in event-on-change-reading aufgelistet ist.
Also bei Dir würde jetzt das Reading 1 nur noch Events erzeugen wenn es geändert wird. Hast Du ein Reading 1?
Alles Klar? :) -> die 1 durch .* ersetzen.
Oder als Antwort auf Deine erste Frage: durch Power ersetzen :). Ich würde aber das regExp beim Logging auf Power.* setzen.
zur dritten Frage: Die sieben Events von Power müsstest Du mal im Eventmonitor zeigen ;)
Gruß Otto
Vierte Frage: wozu ueberhaupt die Events mit event-on-change-reading filtern?
Hallo Zusammen,
danke für die Antworten!
1) Die korrekte Definition von "event-on-change-reading" mit power.* und ähnlichen RegEx hat geholfen
--> das Event landet nun in der Datenbank
2) Den zeitlichen Abstand könnte ich nun vermutlich mit "event-min-interval" erhöhen (liegt aktuell bei 30s was mir zuviel ist)
3) die 7 Events wurden in der Tat nicht im Event-Monitor angezeigt, sind aber in der Datenbank
nicht gestellte Frage ;-)
4) Meine Grundidee war/ist es, die Last zu reduzieren indem ich Events reduziere die von einem Gerät erzeugt werden. Kann sein, dass ich hier den falschen Weg eingeschlagen habe.
Auf jeden Fall geht jetzt was soll - erstmal ;-)
Grüße aus der Messestadt.
//Erik
Das Gerät erhält Messwerte alle 30 sec, den Zeitraum zwischen den Werten kannst Du mit event-min-interval nicht verringern, aber Du kannst in verlängern - ich bin nicht sicher ob ich Dich richtig verstanden habe.
Wenn Du willst, das das Device öfters misst/sendet, dazu musst Du das Gerät in der Weboberfläche einstellen.
Beschreibung findest Du hier: https://shelly-api-docs.shelly.cloud/#settings
3) glaub ich Dir nicht. Ohne Events kommt auch nix in die Datenbank.
Gruß Otto
Hallo Erik,
ich versuche grade mir das selbe aufzubauen wie bei dir ich verstehe nur nicht wie du das mit dem kWh gemacht hast? Ich weis irgendwie nicht genau was ich falsch mache, könntest du mir vielleicht zeigen was du für deinem shelly in der fhem.cfg stehen hast?
Ich verstehe irgendwie nicht wie du das eigebaut hast: shellies/shelly1pm-005C4C/relay/0/energy:.* {'relay_0_kWh' => sprintf("%.2f",$EVENT/60/1000)}
Vielen Danke schon mal vorab.
Gruß Florian
Zitat von: Florian11 am 12 Mai 2020, 15:05:20
Hallo Erik,
ich versuche grade mir das selbe aufzubauen wie bei dir ich verstehe nur nicht wie du das mit dem kWh gemacht hast? Ich weis irgendwie nicht genau was ich falsch mache, könntest du mir vielleicht zeigen was du für deinem shelly in der fhem.cfg stehen hast?
Ich verstehe irgendwie nicht wie du das eigebaut hast: shellies/shelly1pm-005C4C/relay/0/energy:.* {'relay_0_kWh' => sprintf("%.2f",$EVENT/60/1000)}
Vielen Danke schon mal vorab.
Gruß Florian
Wenn es dir um ein Reading energy in kwH geht, könntest du auch einfach ein userReadings nutzen.
Habe bei mir eines dazu mit folgendem Inhalt angelegt:
energy_KWH { ReadingsVal("MQTT2_shelly_bad_licht","energy",0)/60000;; }
Hallo KurtK,
Super Danke Schön!!! Das hat mir wirklich weiter geholfen.
Da das Device vermutlich auch andere Readings ständig aktualisiert: Bitte noch einen "trigger" einbauen!
energy_KWH:energy.* { ReadingsVal("MQTT2_shelly_bad_licht","energy",0)/60000;; }
Dankeschön, das war mir nicht bewusst.
Verstehe ich es richtig, dass sich in diesem Fall das userReadings dann nur aktualisiert, wenn sich das Reading energy aktualisiert?
Ja. Genau.
OK wofür ist den der trigger und wie baue ich den ein? Irgendwie Scheiter ich daran, bekomme bei jedem versuch nur ein syntax error :( habe leider noch nie mit einem trigger gearbeitet!
steht doch in #8 und #9 ???
Zitatdas userReadings dann nur aktualisiert, wenn sich das Reading energy aktualisiert
Zitatenergy_KWH:energy.*
Das Rote ist der Trigger
oh man danke schön :o