MQTT2_Device (Shelly1pm) und Logging

Begonnen von ritter_runkel, 26 Dezember 2019, 15:42:42

Vorheriges Thema - Nächstes Thema

ritter_runkel

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
FHEM auf Raspberry Pi 2B
2x eService 1WireHu, 7x DS1820, 2x Multisensoren Wiregate AMS 2.11 für Temperatur DS1820, relativer Luftfeuchte HIH4031, zwei IO-Ports DS2438, Analog-Eingang 0-10 V (bzw. 0-20 mA) DS2413
FritzDECT; HUE; 5xFibaro RollerShutter, Rauchmelder

Otto123

#1
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
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

rudolfkoenig

Vierte Frage: wozu ueberhaupt die Events mit event-on-change-reading filtern?

ritter_runkel

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
FHEM auf Raspberry Pi 2B
2x eService 1WireHu, 7x DS1820, 2x Multisensoren Wiregate AMS 2.11 für Temperatur DS1820, relativer Luftfeuchte HIH4031, zwei IO-Ports DS2438, Analog-Eingang 0-10 V (bzw. 0-20 mA) DS2413
FritzDECT; HUE; 5xFibaro RollerShutter, Rauchmelder

Otto123

#4
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
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

Florian11

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

KurtK

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;; }
- FHEM auf Intel NUC mit Proxmox -
- FTUI mit FUIP -
- HM, Zigbee,  WLAN -

Florian11

Hallo KurtK,

Super Danke Schön!!! Das hat mir wirklich weiter geholfen.

Beta-User

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;; }
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

KurtK

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?
- FHEM auf Intel NUC mit Proxmox -
- FTUI mit FUIP -
- HM, Zigbee,  WLAN -

Beta-User

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

Florian11

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!

Otto123

#12
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
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

Florian11