FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: matze1999 am 27 Juli 2022, 09:10:00

Titel: [gelöst]ReadingsNum "=" oder "eq" und Bedingung im at
Beitrag von: matze1999 am 27 Juli 2022, 09:10:00
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
Titel: Antw:ReadingsNum "=" oder "eq"
Beitrag von: Ralli am 27 Juli 2022, 09:13:52
In Perl ist bei numerischen Werten der Vergleich mit

==
!=
>=
<=

und bei alphanumerischen Zeichenketten der Vergleich mit

eq
ne
lt
gt
ge
le

vorzunehmen.
Titel: Antw:ReadingsNum "=" oder "eq" und Bedingung im at
Beitrag 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?

matze1999
Titel: Antw:ReadingsNum "=" oder "eq"
Beitrag von: Otto123 am 27 Juli 2022, 09:31:15
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
Titel: Antw:ReadingsNum "=" oder "eq" und Bedingung im at
Beitrag von: matze1999 am 27 Juli 2022, 09:41:12
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
Titel: Antw:ReadingsNum "=" oder "eq" und Bedingung im at
Beitrag von: Otto123 am 27 Juli 2022, 10:29:25
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.
Titel: Antw:ReadingsNum "=" oder "eq" und Bedingung im at
Beitrag 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.

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  ::)
Titel: Antw:[gelöst]ReadingsNum "=" oder "eq" und Bedingung im at
Beitrag von: matze1999 am 27 Juli 2022, 11:42:20
vielen Dank,

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

matze1999
Titel: Antw:ReadingsNum "=" oder "eq" und Bedingung im at
Beitrag von: Otto123 am 27 Juli 2022, 13:16:56
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?
Titel: Antw:ReadingsNum "=" oder "eq" und Bedingung im at
Beitrag von: alanblack am 27 Juli 2022, 22:46:50
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
Titel: Antw:ReadingsNum "=" oder "eq" und Bedingung im at
Beitrag von: Damian am 27 Juli 2022, 23:30:48
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.