FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: FHEM16 am 13 Juli 2018, 12:54:36

Titel: Wertebereich abfragen
Beitrag von: FHEM16 am 13 Juli 2018, 12:54:36
Hallo zusammen,

ich habe viele DOIF's in denen Wertebereiche abgefragt werden z.B. Temperatur zwischen 10 Grad und 20 Grad.
Die DOIF's beinhaltet momentan immer 2 Abfragen ( [DEVICENAME:READING] >= 10 && [DEVICENAME:READING] <=20 ).

Ich habe leider bisher noch keine Lösung gefunden um einen Bereich direkt wie z.B. bei Uhrzeiten anzugeben:

[DEVICENAME:READING] == 10-20 oder [DEVICENAME:READING] == [10-20] oder [DEVICENAME:READING] ZWISCHEN 10:20 oder...

Die Informationen, die ich bisher gefunden habe, beziehen immer auf Zeiten und nicht auf feste Werte.
Wie kann ich einen Bereich in einer Abfrage angeben oder wo finde ich Informationen, die sich nicht auf Zeiten beziehen.

Vielen Dank im Vorraus und viele Grüße
Fhem16
Titel: Antw:Wertebereich abfragen
Beitrag von: sash.sc am 13 Juli 2018, 13:33:52
Interessante Frage. Bin auf die Antwort gespannt.


Gesendet von meinem E6653 mit Tapatalk

Titel: Wertebereich abfragen
Beitrag von: JoWiemann am 13 Juli 2018, 13:38:48
In Perl gibt es den Range Operator.

my $ref = 7;

if ($ref = 1 .. 9 {
    ...code....
}



Gesendet von iPad mit Tapatalk
Titel: Antw:Wertebereich abfragen
Beitrag von: Ellert am 13 Juli 2018, 19:48:57
Zitat von: FHEM16 am 13 Juli 2018, 12:54:36
Hallo zusammen,

ich habe viele DOIF's in denen Wertebereiche abgefragt werden z.B. Temperatur zwischen 10 Grad und 20 Grad.
Die DOIF's beinhaltet momentan immer 2 Abfragen ( [DEVICENAME:READING] >= 10 && [DEVICENAME:READING] <=20 ).

Ich habe leider bisher noch keine Lösung gefunden um einen Bereich direkt wie z.B. bei Uhrzeiten anzugeben:

[DEVICENAME:READING] == 10-20 oder [DEVICENAME:READING] == [10-20] oder [DEVICENAME:READING] ZWISCHEN 10:20 oder...

Die Informationen, die ich bisher gefunden habe, beziehen immer auf Zeiten und nicht auf feste Werte.
Wie kann ich einen Bereich in einer Abfrage angeben oder wo finde ich Informationen, die sich nicht auf Zeiten beziehen.

Vielen Dank im Vorraus und viele Grüße
Fhem16

Zwei Abfragen sind der übliche Weg.
Alternativ kannst Du die Abfragen in eine Funktion auslagern.

sub isInRange {
my ($minval,$testval,$maxval)  = @_;
return ($minval <= $testval and $testval < $maxval) ? 1 : 0 ;
}

Verwendung in der Bedingung
... isInRange(10,[DEVICENAME:READING],20) ...

Die asymetrischen Vergleichsoperatoren ermöglichen einen lückenlosen Kettenvergleich in verschiedenen Zweigen, wobei der vorhergehende Endwert auch der neue Startwert ist.

Zitat(... isInRange(10,[DEVICENAME:READING],20) ...)
DOELSEIF (... isInRange(20,[DEVICENAME:READING],30) ...)

Zum Range-Operator, siehe https://forum.fhem.de/index.php/topic,58191.msg497179.html#msg497179
Titel: Antw:Wertebereich abfragen
Beitrag von: FHEM16 am 14 Juli 2018, 02:06:36
Hallo Ellert,

vielen Dank für die hilfreiche Information und sub!
Es funktioniert wie gewünscht ... etwas ungewohnt einen Vergleich zu schreiben aber ich werde mich daran gewöhnen :)

Ich habe $readingval <= $maxval angepasst (damit 20 noch einbezogen wird) und noch ($$$) hinzugefügt ... hoffentlich keine Fehler.
Bitte gebe mir eine Rückmeldung, falls ich einen Denkfehler habe.

Die aktuelle sub schaut so aus:

####################################################
## Wertebereich abfragen: ( [DEVICENAME:READING] >= 10 && [DEVICENAME:READING] <=20 )
####################################################
sub isInRange ($$$){
my ($minval,$readingval,$maxval)  = @_;
return ($minval <= $readingval and $readingval <= $maxval) ? 1 : 0 ;
}
####################################################


Nochmals vielen Dank und viele Grüße
Fhem16
Titel: Antw:Wertebereich abfragen
Beitrag von: Per am 16 Juli 2018, 12:39:42
Zitat von: FHEM16 am 14 Juli 2018, 02:06:36Ich habe $readingval <= $maxval angepasst (damit 20 noch einbezogen wird)
Hättest auch einfach "21" als obere Grenze nehmen können ;). Aber beide Seiten inkl. finde ich auch die "menschlichere" Lösung.
Titel: Antw:Wertebereich abfragen
Beitrag von: FHEM16 am 16 Juli 2018, 21:12:43
Hi Per,

ich habe mich auch für die " "menschlichere" Lösung" entschieden :) da ich nicht überlegen wollte, was die Zeile jeztzt genau bedeutet und >= && <= war für mich eindeutig.
ZitatHättest auch einfach "21" als obere Grenze nehmen können
hätte mir aber nicht geholfen, da <21 auch 20.1-20.9 bedeutet und ich max. 20.0 wollte ;)

Ich habe bereits einige DOIF's mit Deiner sub angepasst und bin total HAPPY!

Nochmals vielen Dank dafür und viele Grüße
Fhem16