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?
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
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...
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.
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.
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]
Ja, Variable ist nicht richtig. Vielleicht hätte ich "Platzhalter" schreiben sollen, aber der Begriff wird auch wieder anderes interpretiert.
Du bist da exakter.
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.
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.
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)
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!
Zitat von: Stonemuc am 24 Mai 2019, 11:01:18
[Weatherman:vm_var_azimut] gt 80
Hier wäre ">" angebracht.
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
Dann
[Weatherman:vm_var_azimut:d] > 80
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?
:d gibt nur den Zahlenwert einer Variable zurück: "-15.9°C Raumtemperatur" wird zu -15.9