Hallo,
ich habe nach 3-Jahren (never touch a running System) ein großes Update gewagt, von Raspi 2 nach Raspi 4B und FHEM von 2017 zur aktuellen Version.
Am Anfang ging gar nichts, aber mittlerweile (mein freier Freitag und der halbe Samstag ist dabei draufgegangen) funktioniert wieder alles.
Allerdings bleibt ein Problem: Es tauchen jede Menge PERL WARNINGS im log-file auf. Dabei kann man zwei Arten unterscheiden
Typ I:
2020.06.20 13:32:55 1: PERL WARNING: Use of uninitialized value in sprintf at (eval 35183) line 1.
2020.06.20 13:32:55 1: stacktrace:
2020.06.20 13:32:55 1: main::__ANON__ called by (eval 35183) (1)
2020.06.20 13:32:55 1: (eval) called by fhem.pl (4667)
2020.06.20 13:32:55 1: main::evalStateFormat called by fhem.pl (4770)
2020.06.20 13:32:55 1: main::readingsEndUpdate called by fhem.pl (4960)
2020.06.20 13:32:55 1: main::readingsSingleUpdate called by ./FHEM/00_MQTT.pm (548)
2020.06.20 13:32:55 1: MQTT::__ANON__ called by FHEM/GPUtils.pm (75)
2020.06.20 13:32:55 1: GPUtils::GP_ForallClients called by ./FHEM/00_MQTT.pm (560)
2020.06.20 13:32:55 1: MQTT::Read called by fhem.pl (3793)
2020.06.20 13:32:55 1: main::CallFn called by fhem.pl (762)
Typ II:
2020.06.20 13:32:55 1: PERL WARNING: Use of uninitialized value in sprintf at (eval 35185) line 1.
2020.06.20 13:32:55 1: stacktrace:
2020.06.20 13:32:55 1: main::__ANON__ called by (eval 35185) (1)
2020.06.20 13:32:55 1: (eval) called by fhem.pl (4667)
2020.06.20 13:32:55 1: main::evalStateFormat called by fhem.pl (4770)
2020.06.20 13:32:55 1: main::readingsEndUpdate called by ./FHEM/98_expandJSON.pm (189)
2020.06.20 13:32:55 1: main::expandJSON_decode called by ./FHEM/98_expandJSON.pm (164)
2020.06.20 13:32:55 1: main::__ANON__ called by fhem.pl (3328)
2020.06.20 13:32:55 1: main::HandleTimeout called by fhem.pl (684)
Wie kann ich das debuggen? Insbesondere die Typ I (MQTT)?
Beim Typ II kann ich mir vorstellen die expandJSONs (habe 10 Stück) solange zu deaktivieren bis die Meldung nicht mehr kommt, ist aber aufwändig weil die im Vergleich zum Typ I seltener kommen.
Ich würde mich über Tips sehr freuen....
Die expandJSON DEF's (Typ II) sehen z.B. so aus:
Waschmaschine2019.*:Sensor.*:.\{.*} (ENERGY_Voltage|ENERGY_Current|ENERGY_Power|ENERGY_Total|ENERGY_Today)
Der Sensor liefert solche Daten
Zitat{"Time":"2020-06-20T21:17:20","Epoch":1592684240,"ENERGY":{"TotalStartTime":"2019-10-25T13:26:26","Total":89.305,"Yesterday":0.000,"Today":0.000,"Period":0,"Power":0,"ApparentPower":0,"ReactivePower":0,"Factor":0.00,"Voltage":234,"Current":0.000}}
list stateFormat=.+ NAME stateFormat
GHSolarMQTT NAME GHSolarMQTT
stateFormat {sprintf("Phase 1: %.0f W Phase 2: %.0f W Phase 3: %.0f W", ReadingsVal($name,"ph1_Power","-1"), ReadingsVal($name,"ph2_Power","-1"), ReadingsVal($name,"ph3_Power","-1"))}
HausPowerMQTT NAME HausPowerMQTT
stateFormat {sprintf("Total Energy: %.2f kWh, Power: %.2f W", ReadingsVal($name,"total_Energy","-1"), ReadingsVal($name,"current_Power","-1") )}
KellerKuehlPow NAME KellerKuehlPow
stateFormat {sprintf("aktuell: %.1f W Tag: %.2f kW/h Total: %.1f kW/h", ReadingsVal ($name, "Power", undef), ReadingsVal($name,"Today",undef), ReadingsVal($name,"Total",undef))}
KuecheKuehlschrankPow NAME KuecheKuehlschrankPow
stateFormat {sprintf("aktuell: %.1f W Tag: %.2f kW/h Total: %.1f kW/h", ReadingsVal ($name, "Power", undef), ReadingsVal($name,"Today",undef), ReadingsVal($name,"Total",undef))}
Luminea1 NAME Luminea1
stateFormat {sprintf("State: %s, Power: %.0f", ReadingsVal("Luminea1","state",undef), ReadingsVal("Luminea1","ENERGY_Power",undef)) }
Luminea2 NAME Luminea2
stateFormat {sprintf("State: %s, Power: %.0f", ReadingsVal("Luminea2","state",undef), ReadingsVal("Luminea2","ENERGY_Power",undef)) }
Luminea3 NAME Luminea3
stateFormat {sprintf("State: %s, Power: %.0f", ReadingsVal("Luminea3","state",undef), ReadingsVal("Luminea3","ENERGY_Power",undef)) }
MQTTSolarPowerFlow NAME MQTTSolarPowerFlow
stateFormat transmission-state
NetworkPow NAME NetworkPow
stateFormat {sprintf("aktuell: %.1f W Tag: %.2f kW/h Total: %.1f kW/h", ReadingsVal ($name, "Power", undef), ReadingsVal($name,"Today",undef), ReadingsVal($name,"Total",undef))}
SolarFronius NAME SolarFronius
stateFormat STATE
SolarMeter NAME SolarMeter
stateFormat STATE
SolarPowerFlow NAME SolarPowerFlow
stateFormat STATE
ThermArbKeller_WindowRec NAME ThermArbKeller_WindowRec
stateFormat last:trigLast
ThermFlurKeller_WindowRec NAME ThermFlurKeller_WindowRec
stateFormat last:trigLast
ThermKilian_WindowRec NAME ThermKilian_WindowRec
stateFormat last:trigLast
ThermSchlaf_WindowRec NAME ThermSchlaf_WindowRec
stateFormat last:trigLast
ThermSpitzLinks_WindowRec NAME ThermSpitzLinks_WindowRec
stateFormat last:trigLast
ThermSpitzRechts_WindowRec NAME ThermSpitzRechts_WindowRec
stateFormat last:trigLast
ThermTobi_WindowRec NAME ThermTobi_WindowRec
stateFormat last:trigLast
ThermWaschKeller_WindowRec NAME ThermWaschKeller_WindowRec
stateFormat last:trigLast
TrocknerPow NAME TrocknerPow
stateFormat {sprintf("aktuell: %.1f W Tag: %.2f kW/h Total: %.1f kW/h State: %s", ReadingsVal ($name, "ENERGY_Power", undef), ReadingsVal($name,"ENERGY_Today",undef), ReadingsVal($name,"ENERGY_Total",undef), ReadingsVal($name,"state",undef))}
Waschmaschine2019Pow NAME Waschmaschine2019Pow
stateFormat {sprintf("aktuell: %.1f W Tag: %.2f kW/h Total: %.1f kW/h State: %s", ReadingsVal ($name, "ENERGY_Power", undef), ReadingsVal($name,"ENERGY_Today",undef), ReadingsVal($name,"ENERGY_Total",undef), ReadingsVal($name,"state",undef))}
WaschmaschinePow NAME WaschmaschinePow
stateFormat {sprintf("aktuell: %.1f W Tag: %.2f kW/h Total: %.1f kW/h", ReadingsVal ($name, "Power", undef), ReadingsVal($name,"Today",undef), ReadingsVal($name,"Total",undef))}
dust1Read NAME dust1Read
stateFormat {sprintf("PM2.5 %.1f µg/m3, PM10 %.1f µg/m3, Temperature %.1f C, rel. Luftfeuchte %.1f %%", ReadingsVal($name,"PM2dot5",0), ReadingsVal($name,"PM10",0), ReadingsVal($name,"Temperatur",0), ReadingsVal($name,"Luftfeuchte",0)) }
rssiRead NAME rssiRead
stateFormat {sprintf("RSSI12sec %.1f dB, RSSI_30sec %.1f dB, RSSI_Alert %s", ReadingsVal($name,"RSSI12SEC",0), ReadingsVal($name,"RSSI30SEC",0), ReadingsVal($name,"RSSIALERT",0)) }
Hmm, ob das die "undef" sein können?
Ja, das ist bestimmt die undefs.
0 wäre auf jeden Fall besser. Das heisst aber, dass die entspr. Readings nicht mehr existieren. Das müsstest Du kontrollieren.
Genauso stat ReadingsVal wäre ReadingsNum besser, falls irgendwann eine Einheit o.ä. in den Readings kommt. Da wäre aber die Fehlermeldung anders ("Argument "xxxxx" isn't numeric in sprintf")
Danke für die Hilfe! Die Ursache war, das ich bisher immer auch die State Variable geprinted habe, das scheint mit der aktuellen FHEM Version nicht mehr zu gehen und daher wurde undef geprintet und die Fehlermeldung generiert