GELÖST: Heizung per Schichtplan steuern

Begonnen von CatWeazle, 04 Januar 2021, 18:43:57

Vorheriges Thema - Nächstes Thema

CatWeazle

Hi Leutz,

mein Plan:
in meiner Frühschicht soll die Heizung im Bad schon vor dem Aufstehen die Hütte wärmen.

Da ich immer in der geraden Woche Frühschicht habe, soll auch nur da früh angeheizt werden.

kann ich die Woche schon abfragen ....

defmod Welche_KW DOIF ([01:00] and $week % 2)
attr Welche_KW cmdState Gerade|Ungerade


Dann soll die Heizung (Homematic) um 04:00 Starten
Hier müsste noch die Begrenzung nur Mo.- Fr. rein, irgendwie mit (!($we))

Irgendwie pack ich es nicht ....


Beste Grüße
Mike



Grüße, Mike

*****************************************
********  Wird Zeit für besser Wetter !  ********
*****************************************

ch.eick

#1
Hallo Mike,

schau Dir doch mal den Abfall Kalender an, der würde zum Goolge Kalender verbinden und von dort die Einträge lesen.
Dazu gibt es dann auch noch Funktionen für die 99_myUtils , die Du dann als Muster verwenden kannst.
Damit könntest Du dann mit dem Handy Einträge im Kalender machen, auf die dann die Heizung reagiert.

YAAHM wäre auch einen Blick wert.

my five cent
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

xenos1984

Warum der Umweg über einen von Hand zu fütternden Kalender, statt einfach so?

defmod Welche_KW DOIF ([01:00|WD] and ($week % 2 == 0))

http://fhem.de/commandref_DE.html#DOIF_Wochentagsteuerung

CatWeazle

Hallo Christian,

mit dem Google Kalender ist ein guter Ansatz, aber den nutze ich fürs Alltagsgeschäft den will ich mir nicht mit dem Schichtplan vermüllen.

Der Ansatz per 99_myUtils, der gefällt mir besser.

Zumal es in meinem Fall ja auch nur um die alternierende Woche geht, da ist ein Kalender schon alleine vom Eintragen der Schichten viel zu aufwändig.

Nun könnte man mit 99_myUtil eine Routine basteln, die da heißt, prüfe täglich um 04:00 ob Woche gerade und nicht Wochenende ist, Bedinung erfüllt, dann set Bad-Heizung auf 22  ! fertig !

Ja, aber wie sag ich es meinem Kinde ?!?!?!

Und die nächste Frage, könnte man das nicht in einen Define AT ... ... zusammenfassen ?!?!??

So funktioniert es schon, es fehlt die Abfrage der Woche, die ich eingangs schon beschrieben habe, wenn ich die noch hier hereinbringen könnte, würde es passen!

defmod Badheizung_ein_0400 at *04:00:00 { if (!($we)) { fhem("set Badheizung desired-temp 22");; } }

Da fehlt eigentlich in der If Abfrage nur noch ein "and" zustand der Woche (gerade / ungerade) und das Ding ist fertig!

Aber auch da weiß ich nicht weiter .... da fehlen mir die Programmierkenntnisse.

Beste Grüße
mike



Grüße, Mike

*****************************************
********  Wird Zeit für besser Wetter !  ********
*****************************************

ch.eick

Zitat von: CatWeazle am 04 Januar 2021, 23:13:36
mit dem Google Kalender ist ein guter Ansatz, aber den nutze ich fürs Alltagsgeschäft den will ich mir nicht mit dem Schichtplan vermüllen.
Zumal es in meinem Fall ja auch nur um die alternierende Woche geht, da ist ein Kalender schon alleine vom Eintragen der Schichten viel zu aufwändig.
Du kannst auch mehrere Kalender definieren um die Verwendung zu trennen.
Mit einem Kalender Client kannst Du dann die Kalender auch Überlagern.
Bei den Einträgen lässt sich eine 14 Tägige Wiederholung verwenden. Du trägst 5 Tage, Mo-Fr jeweils mit 14 Tage Rhythmus ein.
Dann nur noch die Sonderfälle ausblenden und fertig. Oder die Sonderfälle bei der Abfrage in der myUtils, also wenn Schicht und Feiertag, dann nicht.., ausblenden.

Zitat
Ja, aber wie sag ich es meinem Kinde ?!?!?!
Und die nächste Frage, könnte man das nicht in einen Define AT ... ... zusammenfassen ?!?!??
In beiden Fällen musst Du es in Perl definieren. Ich bevorzuge auch den Ansatz mit Perl innerhalb eines Devices.

Zitat
defmod Badheizung_ein_0400 at *04:00:00 { if (!($we)) { fhem("set Badheizung desired-temp 22");; } }

Da fehlt eigentlich in der If Abfrage nur noch ein "and" zustand der Woche (gerade / ungerade) und das Ding ist fertig!
Dann versuche es doch mal mit einem DOIF, da kannst Du die Bedingungen schöner darstellen.


################################################################################################################
## 1 Heizungssteuerung Schichtplan
##
([04:00] and ... )
    ( set Badheizung desired-temp 22 )

An der Stelle mit ... kommen Deine anderen Bedingungen, da habe ich jetzt nichts hingeschrieben, da ich es momentan nicht testen kann.
Die Definition eines DOIF bitte der Dokumentation entnehmen und dann unter "DEF" die Bedingung und die set Kommandos eintragen.

VG
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

juergen012

Hallo,
ich habe einen Google Kalender fhem. In den trage ich die Ereignisse für fhem ein. Bei frueh schaltet einen dummy frueh. Die Frühtermine trage ich als Serientermine ein.
Einschalten:
defmod SwitchActorOn notify Google_Kalender:start:.* {my $reading="$EVTPART0";; my $uid= "$EVTPART1";; my $actor= fhem("get Google_Kalender summary $uid 1");; if(defined $actor) { fhem("set $actor on") }}

Ausschalten:
defmod SwitchActorOff notify Google_Kalender:end:.* {my $reading="$EVTPART0";; my $uid= "$EVTPART1";; my $actor= fhem("get Google_Kalender summary $uid 1");; if(defined $actor) { fhem("set $actor off") }}

Steht so im Wiki.

Vielleicht hilft´s ja..
Gruß
Jürgen K.
Fhem unter Proxmox

Beta-User

Ganz andere Alternative:

Die Heizpläne für die unterschiedlichen Schichten in weekprofile (als Topic dann u.a. "Frühschicht" oder "Spätschicht") hinterlegen, und dann den Thermostat "Badheizung" durch einen WeekdayTimer steuern lassen (der seinerseits die Daten von weekprofile erhält).
Dann kannst du auch gleich einstellen, ab wann wieder abgesenkt werden soll bzw. wann du zurückkommst usw. usf., und auch eine Übersteuerung für $we ist kein Problem...

Dann muss das at nur das Topic am zentralen weekprofile ändern...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

ch.eick

Zitat von: Beta-User am 05 Januar 2021, 11:49:51
Ganz andere Alternative:

Die Heizpläne für die unterschiedlichen Schichten in weekprofile (als Topic dann u.a. "Frühschicht" oder "Spätschicht") hinterlegen, und dann den Thermostat "Badheizung" durch einen WeekdayTimer steuern lassen (der seinerseits die Daten von weekprofile erhält).
Dann kannst du auch gleich einstellen, ab wann wieder abgesenkt werden soll bzw. wann du zurückkommst usw. usf., und auch eine Übersteuerung für $we ist kein Problem...

Dann muss das at nur das Topic am zentralen weekprofile ändern...
Das wäre ähnlich zu ==> YAAHM wäre auch einen Blick wert.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

CatWeazle

Hi Leutz,

besten Dank für die vielen Denkanstöße.

Also ich denke, ich werde mich ein wenig mit Perl auseinandersetzten müssen, denn ich möchte es in einem AT oder Doif so minimalistisch wie geht umsetzten.

Wenn das Device einmal für die Heizung funktioniert, kann man es leicht beliebig für andere Anwendungen anpassen.
Beispiele wären, mit dem gleichen Code des Heizungs-Device nur den Device-Namen und das Ziel ändern und schon startet in der Frühschichtwoche um 04:30 Uhr die Kaffeemaschine.

Ich werde Christians Empfehlung folgen und versuchen das Ganze in ein doif zu verpacken.
Auch wenn ich mich noch nicht wirklich mit Perl beschäftigt habe, so wird es hier auch und /oder Operatoren geben.

Mein Favorit bleibt das Device einem Doif oder AT Befehl mit Perl zu Ende zu bringen.

Der Anfang ist ja schon gemacht ... ...

defmod Welche_KW DOIF ([01:00] and $week % 2)
attr Welche_KW cmdState Gerade|Ungerade


Jetzt noch hier den Status von Welche_KW mit abfragen ...
defmod Badheizung_ein_0400 at *04:00:00 { if (!($we)) { fhem("set Badheizung desired-temp 22");; } }

... ... ich schau mir Perl an ...

Fürs Erste vielen Dank für die gute gemeinten Anregungen.

Beste Grüße
Mike



Grüße, Mike

*****************************************
********  Wird Zeit für besser Wetter !  ********
*****************************************

CatWeazle

Hi Leutz,

Hier meine funktionierende Lösung in einem Satz!

defmod DOIF_BAD_WK_AT DOIF ([01:00] and $week % 2 == 1) (defmod Badheizung_ein_0400 at 04:00:00 { if (!($we)) { fhem("set Badheizung desired-temp 22") } })  DOELSE (set Telegram msg 'Gerade-Woche')

Der Code prüft um eins in der Nacht, ob die Woche gerade ist oder nicht, ist sie ungerade definiert er einen AT Timer, der um vier die Heizung hochfährt, es sei denn es ist WE, dann nicht. Fertig :)

Das geht bestimmt noch hübscher, aber das ist das, was ich mir zusammenreimen konnte.
Die MSG nach Telegram ist nur für den Test drin.

Für Verschönerungen meines gar so genialen Codes bin ich immer empfänglich :)

beste Grüße
Mike

 
Grüße, Mike

*****************************************
********  Wird Zeit für besser Wetter !  ********
*****************************************

Damian

Zitat von: CatWeazle am 06 Januar 2021, 20:39:22
Hi Leutz,

Hier meine funktionierende Lösung in einem Satz!

defmod DOIF_BAD_WK_AT DOIF ([01:00] and $week % 2 == 1) (defmod Badheizung_ein_0400 at 04:00:00 { if (!($we)) { fhem("set Badheizung desired-temp 22") } })  DOELSE (set Telegram msg 'Gerade-Woche')

Der Code prüft um eins in der Nacht, ob die Woche gerade ist oder nicht, ist sie ungerade definiert er einen AT Timer, der um vier die Heizung hochfährt, es sei denn es ist WE, dann nicht. Fertig :)

Das geht bestimmt noch hübscher, aber das ist das, was ich mir zusammenreimen konnte.
Die MSG nach Telegram ist nur für den Test drin.

Für Verschönerungen meines gar so genialen Codes bin ich immer empfänglich :)

beste Grüße
Mike



das dürfte das Gleiche tun nur einfacher:

defmod DOIF_BAD_WK DOIF ([04:00|AT] and $week % 2 == 1) (set Badheizung desired-temp 22)  DOELSE (set Telegram msg 'Gerade-Woche')
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CatWeazle

Hallo Damian,

einen Code wie den Deinen hatte ich auch schon gebastelt, aber es ist mir nicht gelungen darin noch die "Nicht am Wochenende" Regel mit unterzubringen.
Darum habe ich es Getrennt, ich weiß es einfach nicht besser ... ... :(

Natürlich wäre es viel eleganter den Prozess gleich mit der KW Abfrage ausführen zu lassen und auch kompakter ....

Trotzdem, danke für Deine Antwort.

Beste Grüße
Mike



Grüße, Mike

*****************************************
********  Wird Zeit für besser Wetter !  ********
*****************************************

Damian

Zitat von: CatWeazle am 06 Januar 2021, 23:54:12
Hallo Damian,

einen Code wie den Deinen hatte ich auch schon gebastelt, aber es ist mir nicht gelungen darin noch die "Nicht am Wochenende" Regel mit unterzubringen.
Darum habe ich es Getrennt, ich weiß es einfach nicht besser ... ... :(

Natürlich wäre es viel eleganter den Prozess gleich mit der KW Abfrage ausführen zu lassen und auch kompakter ....

Trotzdem, danke für Deine Antwort.

Beste Grüße
Mike

Dann hast du meinen Vorschlag offensichtlich noch nicht durchschaut:


[04:00|AT] bedeutet nämlich um vier Uhr nur an Arbeitstagen ;)

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

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CatWeazle

#13
Hallo Damian,

sorry, dass |AT hatte ich im Überfliegen übersehen!
Wäre es mir aufgefallen hätte ich danach gefragt, da ich tatsächlich nicht gewusst hätte was es bedeutet.

Wieder eine Kleinigkeit dazugelernt .... besten Dank :)


Grüße
Mike

EDIT:
Eine Frage, wo ist die Dokumentation zum [04:00|AT]  und warum eigentlich eckige Klammern?
Grüße, Mike

*****************************************
********  Wird Zeit für besser Wetter !  ********
*****************************************

Damian

Zitat von: CatWeazle am 07 Januar 2021, 23:59:12
Eine Frage, wo ist die Dokumentation zum [04:00|AT]  und warum eigentlich eckige Klammern?

Angaben in eckigen Klammern sind grundsätzlich DOIF-spezifische Angaben, da empfehle ich die Commandref zu DOIF vom Anfang an zu lesen.

Hier fängt die Beschreibung der Zeitsteuerung an: https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CatWeazle

Hi Demian,

okay, das ist eine gute Lektüre.
Ich lese einfach zu wenig ... besten Dank für den Link.

Grüße
Mike

******************************************
Finale Lösung:
defmod DOIF_BAD_WK DOIF ([04:00|AT] and $week % 2 == 1) (set Badheizung desired-temp 22)
Grüße, Mike

*****************************************
********  Wird Zeit für besser Wetter !  ********
*****************************************

CatWeazle

Hi Leutz,

wäre eigentlich schon gut gewesen, aber da gibt es ein Problem .....

Eingerichtet am So.10.01.2021 hat es am Mo.11.Jan auch funktioniert, aber nur am 11.Jan, danach nicht mehr.

Es scheint so zu sein, dass es nur am Tage des Wechsels von ungerade auf gerade oder umgekehrt funktioniert.
Durch das DOELSE müsste ja täglich eine Telegram msg kommen, so oder so ....

defmod DOIF_BAD_KW DOIF ([03:00|AT] and $week % 2 == 1) (set Telegram msg 'Ungerade-Woche')  DOELSE (set Telegram msg 'Gerade-Woche')
attr DOIF_BAD_KW room Test

setstate DOIF_BAD_KW cmd_2
setstate DOIF_BAD_KW 2021-01-11 03:00:00 cmd 2
setstate DOIF_BAD_KW 2021-01-11 03:00:00 cmd_event timer_1
setstate DOIF_BAD_KW 2021-01-11 03:00:00 cmd_nr 2
setstate DOIF_BAD_KW 2021-01-13 12:13:44 mode enabled
setstate DOIF_BAD_KW 2021-01-11 03:00:00 state cmd_2
setstate DOIF_BAD_KW 2021-01-13 03:00:00 timer_01_c01 14.01.2021 03:00:00|AT


Dann ist das so nicht zu gebrauchen.
Mein Ansatz wäre jetzt, nur am Mo. um 00:01 Uhr den Zustand der Woche abzufragen.
An den Wochentagen um 04:00 das state vom Mo. um 00:01 ermittelten Wochentag zu prüfen und dann zu entscheiden Heizung an oder nicht.

Mal sehen, ob ich das so umgesetzt bekomme.

Grüße
mike
Grüße, Mike

*****************************************
********  Wird Zeit für besser Wetter !  ********
*****************************************

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CatWeazle

Hallo Damian,

nachdem ich mir dann in der Commandref DOIF nochmal angesehen habe, speziell "do always" .... .... ja so funktioniert es.

Optimierte Lösung:
defmod DOIF_BAD_WK DOIF ([04:00|AT] and $week % 2 == 1) (set Badheizung desired-temp 22)
attr DOIF_BAD_WK do always


Vielen Dank für die Unterstützung

Grüße
Mike
Grüße, Mike

*****************************************
********  Wird Zeit für besser Wetter !  ********
*****************************************