FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Predictor am 25 Februar 2013, 14:58:42

Titel: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Predictor am 25 Februar 2013, 14:58:42
Hallo,

ich versuche gerade per at-Befehl meine Heizung abends herunterzuregeln.
Bisher hatte ich einfach um 22:30Uhr gesagt fahre auf 17° herunter - hat auch funktioniert.
Nur wenn ich nun im Urlaub bin und die Heizung auf 16° eingestellt hatte, wird eben die Temperatur wieder auf 17° hoch gedreht.

Ich wollte nun einfach ein if mit einbauen um abzufragen:
Wenn Temperatur höher als 17.0 dann stelle temp auf 17.0 ein.


Hier mal mein Versuch (temp und Uhrzeit sind nur zum testen):
define wz_HeizungTest2 at 14:35:00 {if(wz_Heizung desired-temp > 20.5) {fhem("set wz_Heizung desired-temp 16.5")} }

Da erhalte ich diese Meldung:
Argument "-temp" isn't numeric in numeric gt (>) at (eval 143) line 1.
2013.02.25 14:35:00 3: Can't locate object method "wz_Heizung" via package "desired" (perhaps you forgot to load "desired"?) at (eval 143) line 1.


Ich finde gerade nicht den richtigen Ansatz.
Ist es ein Problem mit der Formatierung (keine " gesetzt) oder ist desired-temp nicht numerisch zu vergleichen (wie dann?) oder ist desired-temp der falsche Parameter (mir ist es ja eig. egal wie warm es WIRKLICH im Raum ist, ich will ja prüfen was für eine temp vorgegeben ist (also wäre ja measured oder so falsch).

Hat mir da jemand einen Tipp?


Danke schon mal


Grüße
Thomas
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Puschel74 am 25 Februar 2013, 15:07:15
Hallo,

du wirst die desired-temp erst in eine Variable speichern müssen um den Vergleich durchführen zu könne.

my $temp_innen_wz = (ReadingsVal("EG_Wohnzimmer_Heizung","desired-temp",25));

So mach ich das bei mir.
Nun kannst du mit

if ($temp_innen_wz ne $gew_temp_innen_wz_max) {

die Abfragen und Vergleiche durchführen.

Grüße
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Reinerlein am 25 Februar 2013, 15:14:17
Hallo Puschel74, hallo Thomas,

ich grätsche hier mal gerade rein, damit sich keine Fehler festsetzen...

Die Perl-Anweisung "ne" steht für "Not Equal" und vergleicht Strings. Du möchtest aber Zahlen vergleichen. Da sind, wie von dir, Thomas, geschrieben, das "<" oder auch ">" die richtigen Kandidaten.

Bezugnehmend auf deinen Code zusammen mit Puschels und noch vereinfacht, müsstest du also folgendes schreiben:
define wz_HeizungTest2 at 14:35:00 {if(ReadingsVal('wz_Heizung', 'desired-temp', 0) > 20.5) {fhem("set wz_Heizung desired-temp 16.5")} }

Grüße Reinerlein
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Zrrronggg! am 25 Februar 2013, 15:50:05
Metadiskussion:

Ich habe auch so gearbeitet, aber inzwischen löse ich so Kram anders:
- Wenn ich mehrere Tage weg bin, lege ich einen (Dummy) Schalter um, der z.b. "InUrlaub" heissen könnte.
- wenn ich kurz weg bin, gibt's noch die Alarmanlage.


D.H. ob Scripte die Heizung verstellen oder vielmehr WIE, ist abhängig davon, ob die Alarmanlage an ist (Die Heizung wird nicht ganz hochgeregelt aber auch nicht ganz aus gemacht, seit neustem auch in Abhängigkeit wie lange die Alarmanlage schon an war) und ob der Urlaubsschalter an ist oder nicht (wenn der an ist, geht die Heizung gar nicht an, es sei denn das Thermometer im Heizungskeller ist unter 2 Grad -> Frostschutz).

Dieser Kram hat sich als recht WAF-robust erwiesen, während eine "deduktive" Auswertung der Zieltemperatur gerne dazu führt, das irgendwas schief läuft, wenn andere Personen sich anders als von dir geplant verhalten.


Zusätzlich lassen sich durch so Urlaubsschalter auch andere Dinge regeln, wie z.b. die automatische Einschaltung einer Anwesenheitssimulation oder eine automatische Scharfstellung der Alarmanlage nach 3 Stunden (Nachbar kommt zum Blumen giessen, vergisst aber die Anlage scharf zu stellen... wenn Urlaubsschalter an, wird nach x Stunden von alleine wieder scharf geschaltet)

Mit anderen Worten: Ich möchte dir von der Grundidee abraten.






Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Predictor am 25 Februar 2013, 16:36:56
Danke für die Grätsche Reinerlein!

Dein Beispiel funktioniert perfekt!!!

Kannst du mir bitte (zu meinem Verständnis) noch kurz den aufbau erklären?
Zitat von: Reinerlein schrieb am Mo, 25 Februar 2013 15:14define wz_HeizungTest2 at 14:35:00 {if(ReadingsVal('wz_Heizung', 'desired-temp', 0) > 20.5) {fhem("set wz_Heizung desired-temp 16.5")} }

bis zu der geschweiften Klammer ist die Syntax ja normal at dann kommt die if abfrage...
=> ReadingsVal - ist dies nötig damit die zu vergleichende Werte in Variablen geladen werden?
-> die allgemeine Syntax wäre dann also: ReadingsVal('<DeviceName>', '<auszulesenderWert>', <die Null ist mir unklar>)

Ich würde dies dann auch mal im Wiki hinterlegen.


Grüße und großes Danke
Predictor


PS: @Zrrronggg! -> dies soll nur Step1 sein, in der Endgültigen Konfig habe ich mir auch etwas in der Richtung vorgestellt, also mit globalen Variablen zu arbeiten die dann evtl von einem Kalender, Bewegungsmelder usw gesetzt werden (denn wenn laut Kalender keiner zu Hause sein sollte, aber der Bewegungsmelder anspricht - ist etwas komisch (Einbrecher, Kalender nicht gepflegt, ...).
Aber im Moment traue ich mir so eine komplexe Konfig einfach noch nicht zu => trotzdem danke für den Hinweis!
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Reinerlein am 25 Februar 2013, 17:12:55
Hi Thomas,

es ist im Wiki immer mal wieder beschrieben, aber nicht als FHEM-Befehlsreferenz. So etwas gibt es meines Wissens nach nicht...

Befehl:ReadingsVal(<DeviceName>, <ReadingsName>, <Defaultwert>)Damit wird das entsprechende Reading am entsprechenden Device ausgelesen. Gibt es das Reading nicht, wird Defaultwert zurückgegeben.

Der Rest ist Perl-Syntax. Man kann Prozedurergebnisse (wie dieses von ReadingsVal) und Variablen bei Vergleichen natürlich mischen, und muss diese Ergebnisse nicht unbedingt in Variablen zwischenspeichern. Das tut man meistens nur, wenn das Ermitteln viel Zeit in Anspruch nimmt und man diesen mehrfach benötigt, oder der Wert durch Überschreiben verloren geht.

Perl hat als Besonderheit, dass man einer Variablen nicht ansieht, ob sie eine Zahl oder einen String enthält. Das sind alles sogenannte Skalare (im Gegensatz zu Arrays oder Hashlisten). Um bei einem Vergleich aber die durchaus unterschiedlichen Ergebnisse erzwingen zu können, gibt es eben unterschiedliche Operatoren dafür:<, >, <=, >=, ==, != sind numerische Operatoren
lt, gt, le, ge, eq, ne sind die entsprechenden Stringvergleichsoperatoren

Es ist halt ein Unterschied wie ich die Werte interpretiere:my $var1 = '10';
my $var2 = '2';

# Ergibt true:
if ($var1 > $var2)...

# Ergibt false:
if ($var1 gt $var2)...


Vom Stil der ReadingsVal-Prozedur gibt es einige in FHEM. Entweder man schaut mal einfach in fhem.pl (so mache ich das immer), oder baut sich langsam eine Wissensliste auf:Value(<Devicename>) => Gibt den Inhalt des aktuellen STATE des angegeben Device zurück
.
.
Ich möchte die Liste hier jetzt nicht weiter ausführen, die müsste man aus diversen Forenbeiträgen zusammenstellen, da das doch etwas länger werden dürfte :-)

Grüße Reinerlein
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Puschel74 am 25 Februar 2013, 18:35:50
Hallo,

danke für die Erklärung.

So eine Liste bin ich schon länger am suchen ;-)

Allerdings ist mir noch unklar warum das in meinem Code

if ($temp_aussen < $pruef_temp_aussen_min) {      
   if ($temp_aussen > $pruef_temp_aussen_minmin) {
          if ($temp_innen_wz ne $gew_temp_innen_wz_max) {
   fhem ("set EG_Wohnzimmer_Heizung desired-temp ".$gew_temp_innen_wz_max);
          }


zu diesem Log-Eintrag führt

2013.02.25 15:59:54 3: n_Temp_WZ_hoch wurde geprueft
2013.02.25 15:59:54 3: Prueftemperatur aussen Max: 5.0
2013.02.25 15:59:54 3: Prueftemperatur aussen Min: 4.0
2013.02.25 15:59:54 3: Prueftemperatur aussen MinMin: -0.5
2013.02.25 15:59:54 3: Morgens An: 07:30
2013.02.25 15:59:54 3: Abends Aus: 20:00
2013.02.25 15:59:54 2: dummy set Gewuenschte_Temp_innen_wz 21.5
2013.02.25 15:59:54 2: dummy set Gewuenschte_Temp_innen_sz 17.5
2013.02.25 15:59:55 2: dummy set Aussen_Temp 3.9
2013.02.25 15:59:55 2: FHT set EG_Wohnzimmer_Heizung desired-temp 22.0
2013.02.25 15:59:55 2: FHT set OG_Schlafzimmer_Heizung desired-temp 18.0

2013.02.25 16:09:53 3: n_Temp_WZ_hoch wurde geprueft
2013.02.25 16:09:53 3: Prueftemperatur aussen Max: 5.0
2013.02.25 16:09:53 3: Prueftemperatur aussen Min: 4.0
2013.02.25 16:09:53 3: Prueftemperatur aussen MinMin: -0.5
2013.02.25 16:09:53 3: Morgens An: 07:30
2013.02.25 16:09:53 3: Abends Aus: 20:00
2013.02.25 16:09:53 2: dummy set Gewuenschte_Temp_innen_wz 22.0
2013.02.25 16:09:53 2: dummy set Gewuenschte_Temp_innen_sz 18.0
2013.02.25 16:09:54 2: dummy set Aussen_Temp 3.9
2013.02.25 16:19:53 3: n_Temp_WZ_hoch wurde geprueft
2013.02.25 16:19:53 3: Prueftemperatur aussen Max: 5.0
2013.02.25 16:19:53 3: Prueftemperatur aussen Min: 4.0
2013.02.25 16:19:53 3: Prueftemperatur aussen MinMin: -0.5
2013.02.25 16:19:53 3: Morgens An: 07:30
2013.02.25 16:19:53 3: Abends Aus: 20:00
2013.02.25 16:19:53 2: dummy set Gewuenschte_Temp_innen_wz 22.0
2013.02.25 16:19:53 2: dummy set Gewuenschte_Temp_innen_sz 18.0
2013.02.25 16:19:54 2: dummy set Aussen_Temp 3.4


Um 15:59 wurde im Wohnzimmer und im Schlafzimmer aufgrund der Bedingungen die Temperatur auf den eingestellten max-Wert gestellt.
Wenn der If-Vergleich aber false sein sollte dürfte der FHT doch garnicht gesetzt werden - oder steh ich grad wo auf dem Schlauch?

Sorry für OT

Grüße

P.S.: Die Log-Einträge sollten eigentlich schon lange raus sein aber da ich > und gt ausprobieren wollte habe ich diese noch nicht auskommentiert.
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Reinerlein am 25 Februar 2013, 19:19:43
Hi Thomas,

ich kann gerne auf den Code draufschauen, allerdings ist dieser ja nicht richtig vollständig...

Was mir direkt auffällt, ist, das da ja drei if-Abfragen verschachtelt sind, die sich ausschließen, bzw. dort auch Variablennamen verwendet werden, die fehlerhaft aussehen ($pruef_temp_aussen_minmin)...

Bitte kopier doch das komplette Beispiel (also auch, wie die Variablen besetzt werden), und was eigentlich passieren soll... So ist das etwas schwierig...

Grüße Reinerlein
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: UliM am 25 Februar 2013, 19:57:56
Zitat von: Reinerlein schrieb am Mo, 25 Februar 2013 17:12es ist im Wiki immer mal wieder beschrieben, aber nicht als FHEM-Befehlsreferenz. So etwas gibt es meines Wissens nach nicht...
Hi,
ReadingsVal ist beschrieben in
http://fhem.de/commandref.html#perl

Die Erläuterungen zu perl-Operatoren gibt's in der commandref freilich nicht, die kann/muss man sich googeln.
Aber schön, dass Du das hier mal zusammenstellst :)
LG, Uli
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Puschel74 am 25 Februar 2013, 19:58:16
Hallo,

nicht Thomas sondern ich (Puschel74) hat das Beispiel gepostet ;-)

Die Variablen sind fehlerhaft?
Inwiefern?

Den ganzen Code jetzt hier posten ist etwas viel und hat ja mit dem eigentlichen Beitrag nichts zu tun, denke ich.
Allerdings funktioniert dieser Code seit gut 3 Monaten einwandfrei.
Ok. Die verschachtelten If-Anweisungen kann man sicher noch zusammenkürzen, wie den gesamten Code auch.
Aber so ist er für mich, auch nach 3 Monaten noch, leichter lesbar.

Wenn du dir den Code aber mal anschauen willst, gerne.
Ist ja nichts geheimes ;-)
Aber dann kann ihn dir auch per PM schicken da das ja, wie gesagt, vermutlich nichts mit diesem Beitrag zu tun hat.
Und bevor dir den Code anschaust leg dir eine Kopfschmerztablette bereit ^^

Grüße

Edith: @Uli, wäre so eine nette Liste nicht auch was für dein Einsteiger.pdf??
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: UliM am 25 Februar 2013, 20:00:06
Zitat von: Puschel74 schrieb am Mo, 25 Februar 2013 19:58@Uli, wäre so eine nette Liste nicht auch was für dein Einsteiger.pdf??
Jepp, nehme es in die nächste Version mit auf.
Gruß, Uli
Titel: Aw: Codeschnipsel - Nachtabsenkung wenn temp höher als
Beitrag von: Predictor am 26 Februar 2013, 13:34:50
Hi,

ich habe mal den Codeschnippsel ins WIKI eingepflegt
HIER DER LINK (//www.fhemwiki.de/wiki/AT_um_eine_Temperaturabh%C3%A4ngige_Nachtabsenkung_zu_realisieren)

Großen Dank an Reinerlein, der die eigentliche Hauptarbeit gemacht hat!!!