Hallo,
ich habe ein StateFormat für eine Temperaturmessung erstellt.
Angezeigt wird alles richtig. Im log habe ich aber folgende Fehlermeldung:
2023.04.24 13:04:20 1: PERL WARNING: Invalid conversion in sprintf: "% T" at (eval 9754971) line 1.
2023.04.24 13:04:20 3: eval: sprintf ("T:%.1f°C RF:%.1f% TP:%.1f°C B:%.0f %", ReadingsVal($name,"temperature",0), ReadingsVal($name,"humidity",0), ReadingsVal($name,"dewpoint",0), ReadingsVal($name,"battery",0))
Das StateFormat ist, wie schon in der Fehlermeldung wie folgt:
{sprintf ("T:%.1f°C RF:%.1f% TP:%.1f°C B:%.0f %", ReadingsVal($name,"temperature",0), ReadingsVal($name,"humidity",0), ReadingsVal($name,"dewpoint",0), ReadingsVal($name,"battery",0))}
List des Devices:
Internals:
CID zigbee_Test_Temp_AZi
DEF zigbee_Test_Temp_AZi
FUUID 64461655-f33f-7c83-5189-7f01513d44985b8f
FVERSION 10_MQTT2_DEVICE.pm:0.268600/2022-12-16
IODev myBroker
LASTInputDev myBroker
MSGCNT 20
NAME MQTT2_zigbee_Test_Temp_AZi
NR 787
STATE T:21.1°C RF:54.8% TP:11.7°C B:100 %
TYPE MQTT2_DEVICE
eventCount 21
myBroker_CONN myBroker_127.0.0.1_33888
myBroker_MSGCNT 20
myBroker_TIME 2023-04-24 12:59:56
READINGS:
2023-04-24 12:20:08 IODev myBroker
2023-04-24 12:21:57 associatedWith MQTT2_zigbee_pi
2023-04-24 07:51:54 attrTemplateVersion 20200904
2023-04-24 12:59:56 battery 100
2023-04-24 12:59:56 dewpoint 11.67
2023-04-24 12:59:56 humidity 54.82
2023-04-24 12:59:56 last_seen 2023-04-24T12:59:56+02:00
2023-04-24 12:59:56 linkquality 51
2023-04-24 12:21:57 state online
2023-04-24 12:59:56 temperature 21.11
2023-04-24 12:59:56 voltage 3100
Attributes:
alias Test Temp AZi
devicetopic zigbee2mqtt/Test_Temp_AZi
icon temperature_humidity
model zigbee2mqtt_TempHumSensor
readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
zigbee2mqtt/Test_Temp_AZi/availability:.* { json2nameValue($EVENT) }
room MQTT2_DEVICE
stateFormat {sprintf ("T:%.1f°C RF:%.1f% TP:%.1f°C B:%.0f %", ReadingsVal($name,"temperature",0), ReadingsVal($name,"humidity",0), ReadingsVal($name,"dewpoint",0), ReadingsVal($name,"battery",0))}
userReadings dewpoint:temperature.* {
my $dp;
my $temperature = ReadingsVal($name,"temperature",0);
my $humidity = ReadingsVal($name,"humidity",0);
my $A = 17.2694;
my $B = ($temperature > 0) ? 237.3 : 265.5;
my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );
my $e = $humidity/ 100 * $es;
if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";
return 0;
}
my $e1 = $e / 610.78;
my $f = log( $e1 ) / $A;
my $f1 = 1 - $f;
if ($f1 == 0) {
Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";
return 0;
}
$dp = $B * $f / $f1 ;
sprintf "%.2f", $dp;
}
Kann mir da jemand helfen?
Vielen Dank und bis denn
SouzA
das % bei RF muss "escaped" werden, bei sprintf mittels %, also %%
...RF:%.1f%%..
der Fehler wird ja auch genau an der Stelle angemeckert.
Viel Erfolg!!
Sany
Hi Sany,
vielen Dank für deine Unterstützung... Jetzt hat es auch funktioniert ohne Fehlermeldung!
Manchmal sind es die einfachsten Dinge ;)
Sieht nun so aus:
{sprintf ("T:%.1f°C RF:%.1f%% TP:%.1f°C B:%.0f%%", ReadingsNum($name,"temperature",0), ReadingsNum($name,"humidity",0), ReadingsNum($name,"dewpoint",0), ReadingsNum($name,"battery",0))}
Thx & bis denn
SouzA