[gelöst]ReadingsNum "=" oder "eq" und Bedingung im at

Begonnen von matze1999, 27 Juli 2022, 09:10:00

Vorheriges Thema - Nächstes Thema

matze1999

Hallo,

ich schlag mich wahrscheinlich wieder it einem Problem rum, was in irgendeinem wiki erklärt ist, aber ich verstehe es nicht:

folgender HourCounter leifert mir Werte:

defmod CN.Regenmenge HourCounter HUESensor46:closed
attr CN.Regenmenge devStateStyle style=";;font-size:20px;;;;;;;;"
attr CN.Regenmenge group Bewässerung
attr CN.Regenmenge icon weather_rain_meter
attr CN.Regenmenge room Bewässerung,Garten,Schalter
attr CN.Regenmenge sortby 4
attr CN.Regenmenge stateFormat letzte Stunde regenstunde l/m² | \
heute regentag l/m² | \
lfd. Woche regenwoche l/m²
attr CN.Regenmenge userReadings regenstunde:appCountsPerHour.* {round( ReadingsNum($name,'appCountsPerHour',0)*0.50505, 0 ) },\
regentag:countsPerDay.* {round( ReadingsNum($name,'countsPerDay',0) * 0.50505, 0 ) },\
regenwoche:appCountsPerWeekTemp.* {round( ReadingsNum($name,'appCountsPerWeekTemp',0)*0.50505,0 ) },

setstate CN.Regenmenge letzte Stunde 0 l/m² | \
heute 10 l/m² | \
lfd. Woche 10 l/m²
setstate CN.Regenmenge 2022-07-27 00:00:00 appCountsPerDay 0
setstate CN.Regenmenge 2022-07-27 09:00:00 appCountsPerHour 0
setstate CN.Regenmenge 2022-07-27 09:00:00 appCountsPerHourTemp 0
setstate CN.Regenmenge 2022-07-01 00:00:00 appCountsPerMonth 2
setstate CN.Regenmenge 2022-07-27 06:11:00 appCountsPerMonthTemp 52
setstate CN.Regenmenge 2022-07-24 00:00:00 appCountsPerWeek 1
setstate CN.Regenmenge 2022-07-27 06:11:00 appCountsPerWeekTemp 19
setstate CN.Regenmenge 2022-07-27 06:11:00 appCountsPerYearTemp 56
setstate CN.Regenmenge 2022-07-27 00:00:00 appOpHoursPerDay 0
setstate CN.Regenmenge 2022-07-27 09:00:00 appOpHoursPerDayTemp 0
setstate CN.Regenmenge 2022-07-01 00:00:00 appOpHoursPerMonth 0
setstate CN.Regenmenge 2022-07-27 00:00:00 appOpHoursPerMonthTemp 0
setstate CN.Regenmenge 2022-07-24 00:00:00 appOpHoursPerWeek 0
setstate CN.Regenmenge 2022-07-27 00:00:00 appOpHoursPerWeekTemp 0
setstate CN.Regenmenge 2022-07-27 00:00:00 appOpHoursPerYearTemp 0
setstate CN.Regenmenge 2022-07-27 00:00:00 appUtilization 0
setstate CN.Regenmenge 2022-07-27 09:00:00 appUtilizationTemp 0
setstate CN.Regenmenge 2022-07-27 09:00:00 appUtilizationTempOld 0
setstate CN.Regenmenge 2022-07-27 09:00:00 countsOverall 56
setstate CN.Regenmenge 2022-07-27 09:00:00 countsPerDay 19
setstate CN.Regenmenge 2022-07-27 00:00:00 pauseTimePerDay 0
setstate CN.Regenmenge 2022-07-27 00:00:00 pulseTimePerDay 0
setstate CN.Regenmenge 2022-07-27 09:00:00 regenstunde 0
setstate CN.Regenmenge 2022-07-27 09:00:00 regentag 10
setstate CN.Regenmenge 2022-07-27 06:11:00 regenwoche 10
setstate CN.Regenmenge 2022-07-27 09:00:00 state 19
setstate CN.Regenmenge 2022-07-27 06:11:00 tickChanged 79
setstate CN.Regenmenge 2022-07-27 00:00:00 tickDay 8
setstate CN.Regenmenge 2022-07-27 09:00:00 tickHour 182
setstate CN.Regenmenge 2022-07-19 20:08:04 tickMonth 0
setstate CN.Regenmenge 2022-07-27 09:00:00 tickUpdated 686
setstate CN.Regenmenge 2022-07-24 00:00:00 tickWeek 1
setstate CN.Regenmenge 2022-07-19 20:08:04 tickYear 0
setstate CN.Regenmenge 2022-07-27 09:00:00 value 1


diese versuche ich in at auszuwerten:

defmod Beregnung.Mi.at at *03:50:00 { if ($wday == 3 && ReadingsNum("CN.Regenmenge","regentag",0) eq 0  && ReadingsNum("CN.Regenmenge","appCountsPerDay",0) < 11)  \
{fhem ("set HUEDevice8 on-for-timer 30;;sleep 330;;set HUEDevice8 on-for-timer 30;;sleep 330;;set HUEDevice8 on-for-timer 3600;;sleep 3900;;set HUEDevice8 on-for-timer 30;;sleep 330;;set HUEDevice8 on-for-timer 3600;;sleep 3900;;set HUEDevice8 on-for-timer 30")}}


einmal mit "eq" und einmal mit "<", ist das richtig?

Und noch eine Frage: sollte während der Ausführung des at eine der Bedingungen nicht mehr gültig sein, wird dann das at abgebrochen oder läuft es bis zum Ende durch?

matze1999

Ralli

In Perl ist bei numerischen Werten der Vergleich mit

==
!=
>=
<=

und bei alphanumerischen Zeichenketten der Vergleich mit

eq
ne
lt
gt
ge
le

vorzunehmen.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

matze1999

#2
das weiss ich, aber

setstate CN.Regenmenge 2022-07-27 09:00:00 regentag 10

wenn ich {ReadingsNum("CN.Regenmenge","regentag",0) eq 10} in der kommandozeile eingebe ist das Ergebnis richtig 1 wie auch bei {ReadingsNum("CN.Regenmenge","regentag",0) == 10} aber sollte nicht nur eine Variante funktionieren?

matze1999

Otto123

#3
Zitat von: matze1999 am 27 Juli 2022, 09:10:00
Und noch eine Frage: sollte während der Ausführung des at eine der Bedingungen nicht mehr gültig sein, wird dann das at abgebrochen oder läuft es bis zum Ende durch?
Hi,

das at ist ein Zeittrigger, der führt den Befehl aus, der im Ausführungsteil des at steht und gut. Vom Rest "weiß" das at nichts ;)
Ist Deine if () Bedingung wahr, wird der Teil in den {Klammern} ausgeführt. Was da drin steht "weiß" die if Bedingung nicht. Die Bedingung wird einmalig geprüft.
Du übergibst eine Folge von Befehlen an FHEM, die werden abgearbeitet. Alle vorhergehenden Schritte sind erledigt.

Zitateinmal mit "eq" und einmal mit "<", ist das richtig?
Aus meiner Sicht vor allem unlogisch, Du vergleichst immer Zahlen. ;)
Zum Nachlesen https://perldoc.perl.org/perlop#Relational-Operators

Zitat von: matze1999 am 27 Juli 2022, 09:27:28
aber sollte nicht nur eine Variante funktionieren?
Nein, denn in deinem Fall stimmt auch der Vergleich der Zeichenketten. Perl ist da flexibel.

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

matze1999

ZitatNein, denn in deinem Fall stimmt auch der Vergleich der Zeichenketten. Perl ist da flexibel.

wann würde es denn nicht mehr funktionieren, bzw. mit welchen "Zahlen"?

matze1999

Otto123

Mit Zahlen, also Ziffernfolgen wird es wohl immer funktionieren? Aber wehe dem Du nimmst ReadingsVal() und es steht mal mehr als eine Zahl drin.
Funktionieren ist relativ :) beim numerischen Vergleich von Strings wird versucht die erste Ziffer aus der Zeichenfolge zu extrahieren.

Mir fällt spontan so ein Fall aus dem Forum ein:
{"10:00" == "10:10"} liefert 1 / true - weil die erste Zahl in der Zeichenkette (nur bis zum :) extrahiert wird
{"10:00" eq "10:10"} liefert nichts / false - weil der Zeichenkettenvergleich gemacht wird.
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

Guybrush

Zerlegt Perl nicht automatisch übergroße Zahlen intern in chunks und vergleicht diese dann? wüsste jetzt nicht, dass das begrenzt ist.

grundlegend solltest du aber immer numerisch vergleichen, wenn du Zahlen vergleichst. Das ist schon allein wegen späterer Nachvollziehbarkeit von code sinnvoll. Du musst da nur aufpassen, dass du nicht strings numerisch vergleichst, alles was dort keine zahl ist, ist da nämlich immer 0. Das sollte aber kein Problem darstellen  ::)

matze1999

vielen Dank,

hab jetzt alles in "numerische Schreibweise" geändert, weil es so richtig und nachvollziehbar ist (ich vergleiche Zahlen)

matze1999

Otto123

Zitat von: Guybrush am 27 Juli 2022, 10:33:22
Zerlegt Perl nicht automatisch übergroße Zahlen intern in chunks und vergleicht diese dann? wüsste jetzt nicht, dass das begrenzt ist.
Den Satz versteh ich nicht  ??? War das allgemein gesagt oder hatte das was mit meiner Antwort zu tun?
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

alanblack

Zitat von: matze1999 am 27 Juli 2022, 09:27:28
das weiss ich, aber

setstate CN.Regenmenge 2022-07-27 09:00:00 regentag 10

wenn ich {ReadingsNum("CN.Regenmenge","regentag",0) eq 10} in der kommandozeile eingebe ist das Ergebnis richtig 1 wie auch bei {ReadingsNum("CN.Regenmenge","regentag",0) == 10} aber sollte nicht nur eine Variante funktionieren?
Ja, bei gleichen Werten funktioniert das so, denn (10 == 10) => wahr und ("10" eq "10") => wahr.
Wenn du jetzt aber auf "kleiner als" testest, dann ist bspw (9 < 10) => wahr, aber ("9" lt "10) => falsch.

Grüße
FHEM 6.0 auf raspi3&ODROID XU4 mit HMLAN und HM-MOD-RPI-PCB, LaCrosse via JeeLink, COC868 und CUL433, Xiaomi Aqara+div. Zigbee via deCONZ, Dooya via SIGNALDuino, ZWave mit Danalock
Jeder Witz kann ein Einzeiler sein mit genügend Semikolons

Damian

Zitat von: alanblack am 27 Juli 2022, 22:46:50
Ja, bei gleichen Werten funktioniert das so, denn (10 == 10) => wahr und ("10" eq "10") => wahr.
Wenn du jetzt aber auf "kleiner als" testest, dann ist bspw (9 < 10) => wahr, aber ("9" lt "10) => falsch.

Grüße

Kann man so nicht sagen? Spätestens wenn im Reading 10.0 steht, funktioniert eq nicht mehr, wie gewünscht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF