DOIF Vergleich anstellen mit Operanden

Begonnen von sash.sc, 01 April 2016, 16:28:28

Vorheriges Thema - Nächstes Thema

sash.sc

Hallo leute.

Muss mal was fragen.  Kurz vorweg, bin aus der Zeit mit Basic und den Commodore Brotkasten gross geworden.
Dort konnte man Vergleiche mit Operanden (= < > <>)  durchführen.
Im DOIF steht immer "eq"  oder "ne" oder.......
Wäre es nicht "angenehmer" mit Operanden zu arbeiten.
Dies würde vielleicht auf dem Verständnis für DOIF helfen.

Ist nur so ne Idee.

Gruß
Sascha

Gesendet von meinem SM-T560 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Damian

Zitat von: sash.sc am 01 April 2016, 16:28:28
Hallo leute.

Muss mal was fragen.  Kurz vorweg, bin aus der Zeit mit Basic und den Commodore Brotkasten gross geworden.
Dort konnte man Vergleiche mit Operanden (= < > <>)  durchführen.
Im DOIF steht immer "eq"  oder "ne" oder.......
Wäre es nicht "angenehmer" mit Operanden zu arbeiten.
Dies würde vielleicht auf dem Verständnis für DOIF helfen.

Ist nur so ne Idee.

Gruß
Sascha

Gesendet von meinem SM-T560 mit Tapatalk


Das DOIF-Modul hat selbst keine Ahnung von Operatoren. Alle Operatoren, die man in der Bedingung angibt sind Perl-Operatoren. Hier findest du alles, was du auch beim DOIF angeben kannst:
https://wiki.selfhtml.org/wiki/Perl/Operatoren

Hier ein Auszug:

ZitatRangstufe: ++ -- (Inkrementieren, Dekrementieren)
Rangstufe: ** (Potenzierung)
Rangstufe: ! ~ (logische und bitweise Negation)
Rangstufe: =~ !~ (Bindung an reguläre Ausdrücke)
Rangstufe: * / % x (Multiplikation, Division, Modulo-Operation, Zeichenkettenwiederholung)
Rangstufe: + - . (Addition, Subtraktion, Zeichenkettenaddition)
Rangstufe: << >> (Verschieben von Bits)
Rangstufe: < > <= >= lt gt le ge (Vergleich größer/kleiner)
Rangstufe: == != <=> eq ne cmp ~~ (Gleichheit/Ungleichheit)
Rangstufe: & (bitweises UND)
Rangstufe: | ^ (bitweises ODER - inklusiv/exklusiv)
Rangstufe: && (logisches UND)
Rangstufe: || (logisches ODER)
Rangstufe: .. (Bereichsdefinition in Listen)
Rangstufe: ?: (Entweder-Oder-Bedingung)
Rangstufe: = += -= ~*= /= %= &= ^= |= (Zuweisung)
Rangstufe: , => (Aneinanderreihung)
Rangstufe: not (logische Negation)
Rangstufe: and (logisches UND)
Rangstufe: or xor (logisches ODER (inklusiv/exklusiv)

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

sash.sc

Danke für die Antwort. Hänge wohl noch zu sehr in der Basic welt fest!
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Damian

Zitat von: sash.sc am 01 April 2016, 16:47:25
Danke für die Antwort. Hänge wohl noch zu sehr in der Basic welt fest!

Wie du der Liste entnehmen kannst, kannst du ebenfalls Operatoren ><=nehmen, aber nur bei Zahlen. Bei Zeichenketten hätte auch Basic mit > Probleme bekommen ;)

Ich habe auch mal mit Basic angefangen und ich kenne auch den Brotkasten (sogar den Vorgänger vom C64). Es lohnt sich aber mal in die Feature-Liste von Perl reinzuschauen - da hat sich in den letzten 30 Jahren etwas getan.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

sash.sc

Coole nummer, dass noch jemand den Brotkasten und seine Varianten (C16/116/plus 4/vc20/.....)kennt .
Im Basic ging das auch nur über Umwege (String umwandeln).
Werde mir die Liste mal bei Zeiten anschauen!
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

chq

#5
Nur weil es hierher passt:

Darf man gt auch in folgendem Fall verwenden, oder muss es > sein?

([speisekammerluefter:AM2301_Humidity] gt [Wetterstation:indoorHumidity])

Und gleich noch eine Frage hinterher:

Ist die folgende Abfrage aufgrund der Gänsefüßchen schlichtweg falsch?

([twilight:elevation:d1] <= "13.8")

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Otto123

Hallo Chris,
perldoc sagt dazu
ZitatBinary "<" returns true if the left argument is numerically less than the right argument.
Binary ">" returns true if the left argument is numerically greater than the right argument.
Binary "<=" returns true if the left argument is numerically less than or equal to the right argument.
Binary ">=" returns true if the left argument is numerically greater than or equal to the right argument.
Binary "lt" returns true if the left argument is stringwise less than the right argument.
Binary "gt" returns true if the left argument is stringwise greater than the right argument.
Binary "le" returns true if the left argument is stringwise less than or equal to the right argument.
Binary "ge" returns true if the left argument is stringwise greater than or equal to the right argument.

Wobei irgendwo auch stand, dass Perl versucht immer erst mal den Ausdruck zu "interpretieren" also falls es geht wird der String auch als Zahl behandelt. Achtung, das ist eventuell gefährliches Halbwissen  ;D

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

chq

#7
Ah, ok. Jetzt wird mir einiges klarer.

Hab mir grad testweise so Mühe gegeben, die Funktion eines funktionierendes DOIFs zu stören.

Egal welche Kombination aus "mit Gänsefüßchen"/"ohne Gänsefüßchen" und "gt/>" ich gewählt habe, das DOIF hat immer funktioniert.

Kann man sagen, dass die "ausgeschriebene Schreibweise" (sprich gt, eq, lt,..) ausschließlich für Strings gilt, wenn es um Texte wie "open" usw. geht?

Angenommen folgendes Event wird erzeugt:

2019-03-05 14:15:21 HP1000 Wetterstation wind_speed: 22.7

Ist das dann ein String mit dem Inhalt 22.7?

Anders gefragt: Wann ist ein Event denn kein String?

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Otto123

Perldoc sagt dazu:
ZitatAll data in Perl is a scalar, an array of scalars, or a hash of scalars. A scalar may contain one single value in any of three different flavors: a number, a string, or a reference. In general, conversion from one form to another is transparent.
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

Damian

Um ein wenig Klarheit in die Sache zu bringen:

Es ist ziemlich egal, ob man Zahlen in Anführungszeichen angibt oder nicht, es kommt auf den Vergleichsoperator an.

Stringvergleiche mit lt, gt, le, ge, eq, ne vergleichen lexikografisch (wie im Telefonbuch), dh.

"09"  lt  "1" ist wahr, weil Null kleiner ist als eins (Stringvergleich wegen lt)

"09" < "1" ist nicht wahr, weil die Zahl neun nicht kleiner ist als 1, hier wird intern verglichen 9 < 1 (Zahlenvergleich wegen <)

Zahlenvergleiche sollten am besten ohne Anführungszeichen gemacht werden.




Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tueftler1983

hallo,
darf ich mich hier mal mir rein werfen?

ich habe dieses doif

([+30] and [Pool:Luft]>40) (set FHEMBOT message Achtung Pool Heizung zu hoch [Pool:luft_corr])
der Wert von Pool:Luft ist 11.4

und bekomme diese meldung im DOIF und log

condition c01: Argument "" isn't numeric in numeric gt (>)


wo ist da mein fehler??

Ellert

Du lässt zu, dass in [Pool:Luft] eine leere Zeichenkette ("") steht und das ist kein numerischer Wert. Da Du einen Vergleichsoperator für numerische Werte verwendest, erhältst Du eine Warnung. Das kannst Du abfangen mit  ...[Pool:Luft] and [Pool:Luft]>40

Streba

#12
Sorry, dass ich mich hier mit einem anderen, aber vielleicht ähnlichen Problem einmische.
Ich habe folgendes DOIF, dass Probleme macht:


([06:00|8])
([netatmo_M02_00_00_XX_XX_XX:temperature] <= 2.0 and [netatmo_M02_00_00_XX_XX_XX:humidity] >= 88)
(set Heizluefter_Auto on)


"netatmo_M02_00_00_XX_XX_XX:temperature" hat einen Wert von 3.3

Dies führt bei mir zu der Fehlermeldung:  di_Heizluefter_Auto_ein: 3.3 <= 2.0 and 92 >= 88: Unknown command 3.3, try help.

Ich bin leider noch immer blutiger Anfänger. Weshalb wird der gelieferte Wert aus dem Reading offenbar als Befehl interpretiert?

Vielen Dank vorab für Eure Hilfe!

Frank_Huber

poste doch mal bitte ein komplettes list des DOIF im Fehlerstatus.

yersinia

Für mich sieht das nach einem Klamemrproblem aus; du scheinst den Befehlsteil bereits in der ersten Zeile (nach dem ([06:00|8])) beendet zu haben. Versuche mal sowas:
(([06:00|8])
       and ([netatmo_M02_00_00_XX_XX_XX:temperature] <= 2.0)
       and ([netatmo_M02_00_00_XX_XX_XX:humidity] >= 88))
(set Heizluefter_Auto on)
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl