FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: MartinD am 12 November 2024, 18:56:50

Titel: MQTT mit userreading
Beitrag von: MartinD am 12 November 2024, 18:56:50
Hallo,

ich habe hier ein Problem mit userreading:

----
defmod MQTT2_Gasmeter MQTT2_DEVICE Gasmeter
attr MQTT2_Gasmeter DbLogInclude MQTT_Gas
attr MQTT2_Gasmeter event-min-interval .*:3600
attr MQTT2_Gasmeter event-on-change-reading MQTT_Gas:0.2,.*
attr MQTT2_Gasmeter group MQTT2_DEVICE
attr MQTT2_Gasmeter readingList powermeter:powermeter/status:.* status\
powermeter:powermeter/MAC:.* MAC\
powermeter:powermeter/IP:.* IP\
powermeter:powermeter/hostname:.* hostname\
powermeter:powermeter/interval:.* interval\
powermeter:powermeter/connection:.* connection\
powermeter:powermeter/uptime:.* uptime\
powermeter:powermeter/freeMem:.* freeMem\
powermeter:powermeter/wifiRSSI:.* wifiRSSI\
powermeter:powermeter/CPUtemp:.* CPUtemp\
powermeter:powermeter/main/error:.* error\
powermeter:powermeter/main/raw:.* raw\
powermeter:powermeter/main/json:.* { json2nameValue($EVENT) }\
powermeter:powermeter/main/value:.* value\
powermeter:powermeter/main/rate:.* rate\
powermeter:powermeter/main/rate_per_time_unit:.* rate_per_time_unit\
powermeter:powermeter/main/changeabsolut:.* changeabsolut\
powermeter:powermeter/main/rate_per_digitalization_round:.* rate_per_digitalization_round\
powermeter:powermeter/main/timestamp:.* timestamp
attr MQTT2_Gasmeter room Heiz-Kessel,MQTT2_DEVICE,Messungen
attr MQTT2_Gasmeter stateFormat value
attr MQTT2_Gasmeter userReadings MQTT_Gas {sprintf("%.3f",ReadingsVal("MQTT2_Gasmeter","value",0))}

setstate MQTT2_Gasmeter 2024-11-12 18:44:14 CPUtemp 55
setstate MQTT2_Gasmeter 2024-11-04 14:35:19 IODev myBroker
setstate MQTT2_Gasmeter 2024-09-24 15:16:50 IP 192.168.0.185
setstate MQTT2_Gasmeter 2024-09-24 15:16:50 MAC A8:42:E3:56:50:BC
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 MQTT_Gas 0.000
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 changeabsolut 0.000
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 connection connected
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 error Neg. Rate - Read:  - Raw: 00453.65N - Pre: 753.623
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 freeMem 814235
setstate MQTT2_Gasmeter 2024-09-24 15:16:50 hostname gasmeter2
setstate MQTT2_Gasmeter 2024-09-24 15:16:50 interval 10.0
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 pre 753.623
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 rate
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 rate_per_digitalization_round 0.000
setstate MQTT2_Gasmeter 2024-11-12 18:34:14 rate_per_time_unit 0.000000
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 raw 00453.65N
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 status Flow finished
setstate MQTT2_Gasmeter 2023-07-11 10:15:19 subscriptions powermeter/ctrl/flow_start powermeter/ctrl/set_prevalue
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 timestamp 2024-11-12T18:33:47+0100
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 uptime 4249799
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 value
setstate MQTT2_Gasmeter 2024-11-12 18:44:14 wifiRSSI -84
--

und bekommme in log:

---
2024.11.12 18:44:14 1: PERL WARNING: Argument "" isn't numeric in sprintf at (eval 4497080) line 1.
2024.11.12 18:44:14 3: eval: {sprintf("%.3f",ReadingsVal("MQTT2_Gasmeter","value",0))}
2024.11.12 18:44:14 1: PERL WARNING: Argument "" isn't numeric in sprintf at (eval 4497081) line 1.
2024.11.12 18:44:14 3: eval: {sprintf("%.3f",ReadingsVal("MQTT2_Gasmeter","value",0))}
---
Weiß jemand einen Rat?

Beste Grüße

Martin
Titel: Aw: MQTT mit userreading
Beitrag von: Beta-User am 12 November 2024, 19:04:33
...nicht nur einen...

Bei Gelegenheit.
Titel: Aw: MQTT mit userreading
Beitrag von: MartinD am 12 November 2024, 19:28:32
Bin für alles Dankbar  :)
Titel: Aw: MQTT mit userreading
Beitrag von: passibe am 12 November 2024, 19:28:51
Dein Reading value ist halt einfach leer:
Zitat von: MartinD am 12 November 2024, 18:56:50setstate MQTT2_Gasmeter 2024-11-12 18:44:14 value
Deshalb kriegt sprintf einen leeren string (""), was es ja auch – weil es eigentlich eine Zahl erwartet – rückmeldet:
Zitat von: MartinD am 12 November 2024, 18:56:502024.11.12 18:44:14 1: PERL WARNING: Argument "" isn't numeric

Dein 0 als "Ersatzwert" in ReadingsVal greift nicht, weil das Reading value nicht fehlt, sondern eben nur leer ist.

Ganz unabhängig davon, brauchst du das userReading nicht. Bei MQTT kannst du so ziemlich alles grenzenlos direkt über die readingList anpassen. Dazu einfach mal hier im Forum suchen bzw. googeln und das Wiki anschauen.
Auch den Rest deines Devices kannst du ggfs. noch etwas anpassen, z.B. durch die Nutzung von attr devicetopic. (Gibt bestimmt noch mehr Sachen, aber dafür hat Beta-User sich ja schon als zuständig erklärt :D)
Titel: Aw: MQTT mit userreading
Beitrag von: betateilchen am 12 November 2024, 20:08:39
ReadingsVal("MQTT2_Gasmeter","value",0))}
Zu diesem Konstrukt zwei grundsätzliche Anmerkungen:


Und wenn Du unbedingt ein userReading verwenden willst, kannst Du darin ja prüfen ob value überhaupt einen Wert hat und wenn das nicht der Fall sein sollte, einfach gar kein userReading erzeugen.

Grundsätzlich bin ich aber auch der Meinung, dass man userReadings in Deinem Fall überhaupt nicht braucht.
Titel: Aw: MQTT mit userreading
Beitrag von: MartinD am 12 November 2024, 20:49:01
Danke.
Die Änderung auf:
ZitatReadingNum("MQTT2_Gasmeter","value","0")
hat geholfen.

Auch die grundsätzliche Anmerkungen sind sehr hilfreich.

Beste Grüße
Martin






Titel: Aw: MQTT mit userreading
Beitrag von: betateilchen am 12 November 2024, 20:53:15
Zitat von: MartinD am 12 November 2024, 20:49:01Danke.
Die Änderung auf:
ZitatReadingNum("MQTT2_Gasmeter","value","0")

Das ist genau so "falsch" wie vorher.
Bei ReadingsNum() sollte der default-Wert ein numerischer Wert sein, also 0 anstatt "0".

Titel: Aw: MQTT mit userreading [Gelöst]
Beitrag von: MartinD am 12 November 2024, 20:57:11
Danke!
Titel: Aw: MQTT mit userreading
Beitrag von: Beta-User am 13 November 2024, 18:05:20
Zitat von: MartinD am 12 November 2024, 18:56:50Weiß jemand einen Rat?
Zitat von: Beta-User am 12 November 2024, 19:04:33...nicht nur einen...
Also:
1. Formatiere deine Beiträge lesbar - Stichwort "code tag". Aber das weißt du ja eigentlich schon, weil du alle angepinnten Beiträge gelesen hast.
2. Gib alle Infos, die halbwegs relevant sein könnten. Hier: Was ist das für eine "Gegenstelle", und welchen Stand hat dein AI-on-the-edge-ESP ;) ...
3. Zeige, dass du den (in diesem Fall häufig vorkommenden Fehler) schon mal irgendwo hier im Forum gefunden hast - du hattest ja vorher gesucht (s. Punkt 1)
4. Wenn es um's Formatieren eines Werts für die Anzeige geht (?), wäre ggf. stateFormat (-Perl) dein Kandidat.
5. Wenn du schon einen userReadings-Eintrag zu brauchen glaubst, dann setze unbedingt (!) einen sauberen trigger, wenn du wie hier "unendlich" viele Reading-Aktualisierungen hast, die nichts mit deinem userReading zu tun haben.
6. Dein (AI-) Device kann sowohl JSON wie auch "viele Topics", über die dann überwiegend dieselben Infos kommen - du hast beides abonniert. Warum denn? Nimm den JSON-Pfad und deaktiviere alle Doppelungen (JSON auspacken ist nur eine einzige Event-loop für alle Readings, die daraus zu setzen sind).
7. Man kann auch komplexere Funktionen in der readingList aufrufen, um direkt das gewünschte Ergebnis zu erhalten (so man es "braucht"!), aber darauf wurde ja schon hingewiesen.

(8. Ich verwende in userReadings in der Regel $name in ReadingsVal() etc.. Ist zwar nicht so effizient, aber besser "lesbar", weil gleich klar ist, dass man nicht von irgendwo anders her einen Wert holt. Außerdem ist das "rename-fest".)

Zuletzt: Wenn AI da "Mist" liefert (leerer String) hat sicher nicht nur FHEM den einen oder anderen "Verschlucker" damit. Vielleicht läßt sich das in der firmware lösen (=> bug report), FALLS es nicht schon gelöst/addressiert ist...
Titel: Aw: MQTT mit userreading
Beitrag von: MartinD am 18 November 2024, 21:14:54
Danke