Hauptmenü

Wertebereich abfragen

Begonnen von FHEM16, 13 Juli 2018, 12:54:36

Vorheriges Thema - Nächstes Thema

FHEM16

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

sash.sc

Interessante Frage. Bin auf die Antwort gespannt.


Gesendet von meinem E6653 mit Tapatalk

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

JoWiemann

In Perl gibt es den Range Operator.

my $ref = 7;

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



Gesendet von iPad mit Tapatalk
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Ellert

#3
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

FHEM16

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

Per

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.

FHEM16

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