Über notify mehrere at Befehle und "at"

Begonnen von dindihi, 31 März 2017, 09:33:41

Vorheriges Thema - Nächstes Thema

dindihi

Hallo,

da ich zu verschiedenen Zeiten auf der Arbeit anfangen muss, suche ich nach ner Lösung, um per Knopfdruck FHEM mitzuteilen dass am nächsten Morgen die Heizung um 4 Uhr auf etwa 22 Grad Heizen soll.

Hab mir dafür ein Dummy Button angelegt:
define test_Shift dummy
attr test_Shift DbLogExclude .*
attr test_Shift room Programme
attr test_Shift setList on off


und versucht über notify (natürlich sind die "at" Uhrzeiten falsch, nur zum testen hier):
define prg_test_shift notify test_Shift:on define set_test_shift_1 at +00:00:10 {my $oldTemp = ReadingsVal("Bad.Heizung.Clima","desired-temp",15.0)};\
define set_test_shift_3 at +00:00:30 setreading Bad.Heizung.Clima old-desired-temp $oldTemp;\
define set_test_shift_4 at +00:00:40 set Bad.Heizung.Clima desired-temp 24.0;\
define set_test_shift_5 at +00:00:50 set test_Shift off;\
define set_test_shift_6 at +00:01:00 set Bad.Heizung.Clima controlMode auto;\
define set_test_shift_7 at +00:01:10 set Bad.Heizung.Clima desired-temp $oldTemp



die einzelnen Schritte zu übertragen.

Als erstes lese ich die Aktuelle Temp aus.

Schritt 3 setreading könnte ich weglassen. (war Anfangs als test gedacht) Jedoch hier wird schon $oldTemp übertragen, und nicht der Wert, welcher in $oldTemp ist.
(wohl da kein Perl Block)

Versuche ich ein
define prg_test_shift_2 at +00:00:20 {Log 3,"Old Temp: ".$oldTemp};\]
einzufügen, erhalte ich sofort:
Global symbol "$oldTemp" requires explicit package name at (eval 124659) line 1.
Die Variable $oldTemp ist also nur innerhalb des ersten {} Perl Block gültig.

Also auch im letzten Block
fhem("set Bad.Heizung.Clima desired-temp ".$oldTemp)
gibt:
2017.03.30 14:35:03.509 3: set_test_shift_7: Unknown command fhem("set, try help.

bzw wenn ich ohne fhem() versuche: (also nur "set Bad.Heizung.Clima desired-temp $oldTemp")
2017.03.30 14:28:38.837 3: set_test_shift_7: invalid temp:$oldTemp

Der Grund wieso ich mit "at" arbeite ist, da um 04:00 die Heizung einschalten soll, um 04:30 wieder zur gewohnten Temperatur zurück schalten soll.
Natürlich könnte ich auch die templist ändern, jedoch am nachfolgenden Tag soll wieder der Normale Plan aktive sein. Also müsste ich auch mit "at" arbeiten. Ausserdem immer die ganze Templist zu übertragen, möchte ich nicht.

Hat jemand ne andere Idee?
(Bin mir fast sicher dass es einfachere Methoden gibt ;-)


DeeSPe

Wo merkst Du Dir denn wann Du arbeiten musst?
Sicherlich in einem Kalender oder?
Wenn der Kalender auch noch "digital" (z.B. Google) ist, könntest Du diesen in FHEM einbinden und entsprechend Deine Heizung automatisch schalten lassen.
Bei sehr unterschiedlichen Arbeitszeiten würde ich wohl diese Vorgehensweise präferieren.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

Kalender-abhängig ist gut.

Ansonsten: Das klingt nach HM-Thermostaten und um wiederkehrende Einzelfälle. Dafür käre auch in Frage, direkt einen Party-Mode einzustellen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Ellert

Zitat von: dindihi am 31 März 2017, 09:33:41
Hallo,

da ich zu verschiedenen Zeiten auf der Arbeit anfangen muss, suche ich nach ner Lösung, um per Knopfdruck FHEM mitzuteilen dass am nächsten Morgen die Heizung um 4 Uhr auf etwa 22 Grad Heizen soll.

Hab mir dafür ein Dummy Button angelegt:
define test_Shift dummy
attr test_Shift DbLogExclude .*
attr test_Shift room Programme
attr test_Shift setList on off


und versucht über notify (natürlich sind die "at" Uhrzeiten falsch, nur zum testen hier):
define prg_test_shift notify test_Shift:on define set_test_shift_1 at +00:00:10 {my $oldTemp = ReadingsVal("Bad.Heizung.Clima","desired-temp",15.0)};\
define set_test_shift_3 at +00:00:30 setreading Bad.Heizung.Clima old-desired-temp $oldTemp;\
define set_test_shift_4 at +00:00:40 set Bad.Heizung.Clima desired-temp 24.0;\
define set_test_shift_5 at +00:00:50 set test_Shift off;\
define set_test_shift_6 at +00:01:00 set Bad.Heizung.Clima controlMode auto;\
define set_test_shift_7 at +00:01:10 set Bad.Heizung.Clima desired-temp $oldTemp



die einzelnen Schritte zu übertragen.

Als erstes lese ich die Aktuelle Temp aus.

Schritt 3 setreading könnte ich weglassen. (war Anfangs als test gedacht) Jedoch hier wird schon $oldTemp übertragen, und nicht der Wert, welcher in $oldTemp ist.
(wohl da kein Perl Block)

Versuche ich ein
define prg_test_shift_2 at +00:00:20 {Log 3,"Old Temp: ".$oldTemp};\]
einzufügen, erhalte ich sofort:
Global symbol "$oldTemp" requires explicit package name at (eval 124659) line 1.
Die Variable $oldTemp ist also nur innerhalb des ersten {} Perl Block gültig.

Also auch im letzten Block
fhem("set Bad.Heizung.Clima desired-temp ".$oldTemp)
gibt:
2017.03.30 14:35:03.509 3: set_test_shift_7: Unknown command fhem("set, try help.

bzw wenn ich ohne fhem() versuche: (also nur "set Bad.Heizung.Clima desired-temp $oldTemp")
2017.03.30 14:28:38.837 3: set_test_shift_7: invalid temp:$oldTemp

Der Grund wieso ich mit "at" arbeite ist, da um 04:00 die Heizung einschalten soll, um 04:30 wieder zur gewohnten Temperatur zurück schalten soll.
Natürlich könnte ich auch die templist ändern, jedoch am nachfolgenden Tag soll wieder der Normale Plan aktive sein. Also müsste ich auch mit "at" arbeiten. Ausserdem immer die ganze Templist zu übertragen, möchte ich nicht.

Hat jemand ne andere Idee?
(Bin mir fast sicher dass es einfachere Methoden gibt ;-)


Perl-Variablen gelten zunächst nur in dem Perl-Block, in dem Du sie definierst. Daher ist $oldTemp nur innerhalb der geschweiften Klammern gültig und in allen anderen Definitionen nicht.

Du könntest stattdessen ein Reading in Deinem Dummy setzen.

Statt {my $oldTemp = ReadingsVal("Bad.Heizung.Clima","desired-temp",15.0)} so setreading test_Shift oldtemp [Bad.Heizung.Clima:desired-temp]

Zurücksetzen könntest Du so set Bad.Heizung.Clima desired-temp [test_Shift:oldtemp]

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

dindihi

@DeeSPe

Ja, genau, in nem Excel sheet steht, wer wann arbeiten soll, welcher mir jede 4 Stunden zugeschickt wird bei Änderung. Da hab ich schon mit den Python Modulen und Google Calendar was am Laufen, auch wegen den Rollläden.

Wollte aber dieses mal was Neues probieren, und sollte mal Inet ausfallen, würde dies trotzdem noch weiter funktionieren. ( ok, Inet Ausfall ist sehr selten)

Partymodus, noch nicht probiert, aber ne Idee wert!

Werde heute Abend, also nach der Arbeit mal testen :-(

Danke schon mal an alle!