Hauptmenü

DOIF Readings löst nicht aus

Begonnen von Stonemuc, 23 Mai 2019, 11:46:08

Vorheriges Thema - Nächstes Thema

Stonemuc

Hallo liebe Leute,

ich habe ein Problem mit meinem DOIF Readins, welches ich im DOIF als [$SELF:Bedarf] abfragen möchte. Allerdings klappt das nicht so recht.

hier mal die Definition:
Bedarf:[Weatherman:wm_var_sonne_scheint] eq "EIN"  and [Sonnenautomatik] eq "An" and [Regler_Wohnzimmer:temperature > Beschattungstemperatur]

Weatherman:wm_var_sonne_scheint soll "EIN" oder "AUS" aus den Readings meiner Wetterstation abfragen

Sonnenautomatik ist ein dummy, der die Werte An oder Aus annehmen kann

Regler_Wohnzimmer:temperature fragt einen Wert von z.B. 22.5 aus den Readings meines Thermostats ab

Beschattungstemperatur ist ebenfalls ein dummy, der Werte zwischen 22 und 27 in 0.5 Schritten annehmen kann

Auch wenn alle Bedingungen erfüllt sind, geht Bedarf nicht auf 1

Woran kann das liegen? Was übersehe ich? müsste ich die Temperaturen mit ge anstelle >= vergleichen?
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

Damian

Zitat von: Stonemuc am 23 Mai 2019, 11:46:08
Hallo liebe Leute,

ich habe ein Problem mit meinem DOIF Readins, welches ich im DOIF als [$SELF:Bedarf] abfragen möchte. Allerdings klappt das nicht so recht.

hier mal die Definition:
Bedarf:[Weatherman:wm_var_sonne_scheint] eq "EIN"  and [Sonnenautomatik] eq "An" and [Regler_Wohnzimmer:temperature > Beschattungstemperatur]

Weatherman:wm_var_sonne_scheint soll "EIN" oder "AUS" aus den Readings meiner Wetterstation abfragen

Sonnenautomatik ist ein dummy, der die Werte An oder Aus annehmen kann

Regler_Wohnzimmer:temperature fragt einen Wert von z.B. 22.5 aus den Readings meines Thermostats ab

Beschattungstemperatur ist ebenfalls ein dummy, der Werte zwischen 22 und 27 in 0.5 Schritten annehmen kann

Auch wenn alle Bedingungen erfüllt sind, geht Bedarf nicht auf 1

Woran kann das liegen? Was übersehe ich? müsste ich die Temperaturen mit ge anstelle >= vergleichen?

[Regler_Wohnzimmer:temperature > Beschattungstemperatur]
kann so nicht funktionieren
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stonemuc

Wie kann ich denn einen solchen Vergleich dann ausdrücken? Ich möchte mit der Beschattungstemperatur einen Wert vorgeben, ab dem Beschattet wird. Diese soll flexibel sein. Oder müsste ich dann im Dummy ein Reading anlegen, das mit entspechende Wert beschrieben wird? Da hab ich Probleme...
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

Damian

Zitat von: Stonemuc am 23 Mai 2019, 12:19:15
Wie kann ich denn einen solchen Vergleich dann ausdrücken? Ich möchte mit der Beschattungstemperatur einen Wert vorgeben, ab dem Beschattet wird. Diese soll flexibel sein. Oder müsste ich dann im Dummy ein Reading anlegen, das mit entspechende Wert beschrieben wird? Da hab ich Probleme...

Du kannst mit Readings oder Dummys arbeiten. DOIF-Perl-Modus unterstützt auch Variablen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rabehd

Zitat von: Stonemuc am 23 Mai 2019, 12:19:15
Wie kann ich denn einen solchen Vergleich dann ausdrücken? Ich möchte mit der Beschattungstemperatur einen Wert vorgeben, ab dem Beschattet wird. Diese soll flexibel sein. Oder müsste ich dann im Dummy ein Reading anlegen, das mit entspechende Wert beschrieben wird? Da hab ich Probleme...

Du musst nur die []-Klammern richtig setzen.
Damian hat doch schon die Fehlerstelle benannt.
Eckige Klammern umschließen eine Variable und nicht einen Vergleich. Du nutzt also die Variable
Zitat[Regler_Wohnzimmer:temperature > Beschattungstemperatur]
Ich glaube nicht, das Du die hast.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

Zitat von: rabehd am 23 Mai 2019, 13:20:06
Du musst nur die []-Klammern richtig setzen.
Damian hat doch schon die Fehlerstelle benannt.
Eckige Klammern umschließen eine Variable und nicht einen Vergleich. Du nutzt also die Variable  Ich glaube nicht, das Du die hast.

Ich würde es genauer spezifizieren, eckige Klammern umschließen einen Dummy oder Reading, Variablen im klassischen Sinne fangen mit einem Dollarzeichen in Perl an und stehen nicht in eckigen Klammern der DOIF-Syntax.

Um es kurz zu machen: bei DOIF_Readings kannst du schlecht mit Variablen arbeiten, da solltest du Readings oder Dummys (als Ersatz für Perl-Variablen) verwenden. z. B.

[Regler_Wohnzimmer:temperature] > [Beschattungstemperatur]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rabehd

Ja, Variable ist nicht richtig. Vielleicht hätte ich "Platzhalter" schreiben sollen, aber der Begriff wird auch wieder anderes interpretiert.
Du bist da exakter.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

#7
Zitat von: rabehd am 23 Mai 2019, 13:32:56
Ja, Variable ist nicht richtig. Vielleicht hätte ich "Platzhalter" schreiben sollen, aber der Begriff wird auch wieder anderes interpretiert.
Du bist da exakter.

Auch Platzhalter ist etwas anderes. Platzhalter ist z. B. $DEVICE, dieser Platzhalter wird an beliebiger Stelle vom Modul gegen seinen Wert ersetzt, $device ist dagegen eine echte Perl-Variable, die aber nur im Perl-Kontext bekannt ist, insb. im DOIF-Perl-Mode.  Dann passen Readings und Dummys eher zu Variablen, die sogar nach dem Hochfahren ihren Zustand behalten. ;) In Wirklichkeit sind es in DOIF (Angabe in eckigen Klammern) aber Funktionen, um die Verwirrung komplett zu machen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stonemuc

Danke für die Hilfe. Manchmal sieht man den Wald vor lauter Bäumen nicht. Keine Ahnung wie ich drauf gekommen bin,das alles in eine eckige Klammer zu scherben.
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

Stonemuc

Allerdings hab ich jetzt das Problem, dass nicht getriggert wird bzw. keine Bedingung geschalten wird.
Ich hab es davor mit > und <= probiert, da hat mir das Logfile folgenden Fehler ausgespuckt:

2019.05.24 08:12:11 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 134886) line 1.
2019.05.24 08:12:11 3: eval: Beschattung: warning in condition c01
2019.05.24 08:12:11 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 134887) line 1.
2019.05.24 08:12:11 3: eval: Beschattung: warning in condition c02
2019.05.24 08:12:11 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 134888) line 1.
2019.05.24 08:12:11 3: eval: Beschattung: warning in condition c03
2019.05.24 08:12:11 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 134889) line 1.
2019.05.24 08:12:11 3: eval: Beschattung: warning in condition c04
2019.05.24 08:12:11 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 134890) line 1.
2019.05.24 08:12:11 3: eval: Beschattung: warning in condition c05

Hier mal das DOIF

define Beschattung DOIF ([$SELF:Bedarf] and [Weatherman:vm_var_azimut] gt 80 and [Weatherman:vm_var_azimut] le 115) (set Rollo_Kueche position 80, set Rollo_Essen_links position 80, set Rollo_Emelie_Ost position 80, set Rollo_Essen_rechts position 55, set Rollo_Wohnen_links position 55, set Rollo_Wohnen_Mitte position 55, set Rollo_Emelie_Sued position 55, set Rollo_Spielzimmer position 55, set Rollo_Moritz_Sued position 55)
DOELSEIF ([$SELF:Bedarf] and [Weatherman:vm_var_azimut] gt 115 and [Weatherman:vm_var_azimut] le 180) (set Rollo_Kueche position 55, set Rollo_Essen_links position 55, set Rollo_Emelie_Ost position 55, set Rollo_Essen_rechts position 80, set Rollo_Wohnen_links position 80, set Rollo_Wohnen_Mitte position 80, set Rollo_Emelie_Sued position 80, set Rollo_Spielzimmer position 80, set Rollo_Moritz_Sued position 80)
DOELSEIF ([$SELF:Bedarf] and [Weatherman:vm_var_azimut] gt 180 and [Weatherman:vm_var_azimut] le 215) (set Rollo_Kueche position 0, set Rollo_Essen_links position 0, set Rollo_Emelie_Ost position 0, set Rollo_Essen_rechts position 80, set Rollo_Wohnen_links position 80, set Rollo_Wohnen_Mitte position 80, set Rollo_Emelie_Sued position 80, set Rollo_Spielzimmer position 80, set Rollo_Moritz_Sued position 80, set Rollo_Moritz_West position 55, set Rollo_Wohnen_rechts position 55)
DOELSEIF ([$SELF:Bedarf] and [Weatherman:vm_var_azimut] gt 215 and [Weatherman:vm_var_azimut] le 261) (set Rollo_Essen_rechts position 55, set Rollo_Wohnen_links position 55, set Rollo_Wohnen_Mitte position 55, set Rollo_Emelie_Sued position 55, set Rollo_Spielzimmer position 55, set Rollo_Moritz_Sued position 55, set Rollo_Moritz_West position 80, set Rollo_Wohnen_rechts position 80)
DOELSEIF ([$SELF:Bedarf] and [Weatherman:vm_var_azimut] gt 261 and [Weatherman:vm_var_azimut] le 290) (set Rollo_Essen_rechts position 0, set Rollo_Wohnen_links position 0, set Rollo_Wohnen_Mitte position 0, set Rollo_Emelie_Sued position 0, set Rollo_Spielzimmer position 0, set Rollo_Moritz_Sued position 0, set Rollo_Moritz_West position 80, set Rollo_Wohnen_rechts position 80)
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

Damian

#10
Das bedeutet, dass im angegebenen Reading nichts drinsteht, oder das Reading erst gar nicht existiert. Für solche Fälle kannst du auch einen Default-Wert angeben, hier. z. B. 0

siehe:  https://fhem.de/commandref_DE.html#DOIF_notexist

Zahlen natürlich nicht mit gt oder lt vergleichen!
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per


Stonemuc

Ja...das stimmt > und <= ist hier richtig, damit gab es aber das oben besprochene Problem mit den Fehlern im log.
Deshalb hab ich das mit dem gt und le mal probiert. Ich hab's jetzt wieder geändert.
Das Reading existiert...und ist nicht leer.

Liegt das eventuell daran, dass ich den Wert per HTTP Mode über JSON auslese?


reading77JSON vars
reading77Namewm_var_azimut
reading77Regex "name"\s?:\s?"13".*?"value":([+-]?\d*[\.\d]\d*)


Als Reading im device Weatherman taucht der Wert dann folgendermaßen auf:

wm_var_azimut     182.4        2019-05-24 13:21:53
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

Per

Dann
[Weatherman:vm_var_azimut:d] > 80

Stonemuc

Okay...ich probier es nachher mal. Aber mal zum Verständnis - warum das :d? Damit ich auch was lerne und für'S nächste Mal anwenden kann? Mach ich mit dem :d aus der Variable eine Zahl?
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

Per

:d gibt nur den Zahlenwert einer Variable zurück: "-15.9°C Raumtemperatur" wird zu -15.9