Codeschnipsel - Nachtabsenkung wenn temp höher als

Begonnen von Predictor, 25 Februar 2013, 14:58:42

Vorheriges Thema - Nächstes Thema

Predictor

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
FHEM auf Fritz!Box 7390
FS20 per CUL

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Reinerlein

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

Zrrronggg!

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.






FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Predictor

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!
FHEM auf Fritz!Box 7390
FS20 per CUL

Reinerlein

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

Puschel74

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.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Reinerlein

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

UliM

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
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Puschel74

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??
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

UliM

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
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Predictor

Hi,

ich habe mal den Codeschnippsel ins WIKI eingepflegt
HIER DER LINK

Großen Dank an Reinerlein, der die eigentliche Hauptarbeit gemacht hat!!!
FHEM auf Fritz!Box 7390
FS20 per CUL