Suche Uhrzeit Offset Funktion für variable Heizungssteuerung nach iPhone Wecker

Begonnen von sTaN, 13 Februar 2021, 17:11:26

Vorheriges Thema - Nächstes Thema

sTaN

Hallo liebe Community,

ich bin auf der Suche nach einer einfachen Möglichkeit an eine Uhrzeit Variable noch einen Offset -15 Minuten anzuhängen bzw. zu berechnen. Ich hatte es mir einfacher vorgestellt, als es scheinbar ist. Durch die Funktion sunset(-3600) etc. dachte ich, gibt es hierfür etwas ähnliches für ein AT.

Hintergrund:
Über einen NFC Tag am Bett starte ich einen Siri Kurzbefehl, der mir den iPhone Wecker öffnet, ich die Uhrzeit einstelle, diese Uhrzeit dann in eine Variable $timeWeckersTaN schreibe und an Fhem für ein AT übergeben wird. Das AT soll dann die Heizung am nächsten Tag im Bad starten, aber eben 15 Minuten vor der Wecker Uhrzeit.

Ich habe dazu diesen veralteten Thread gefunden, aber scheinbar gibt es die Perl Funktion TimeOffset("",5) nicht mehr?

Habt hier eine Idee, wie ich meine Funktion mit einem Offset von X Minuten gestalten kann?
Hier das aktuelle define meines Notify Notify_BA_Heizung_AutoOn:

statusWeckersTaN:.* {if (Value("statusWeckersTaN") eq "on") {my $timeWeckersTaN = Value("timeWeckersTaN");;fhem"define BA_Heizung_AutoOn at $timeWeckersTaN set WT_Bad desiredTemperature auto comfort ; set WT_Bad desiredTemperature auto"}}

Ich dachte an so etwas in der Art, wie in dem Thread beschrieben, aber das scheint nicht zu funktionieren:

define BA_Heizung_AutoOn at {TimeOffset($timeWeckersTaN,-15)} set WT_Bad desiredTemperature auto comfort

Der verlinkte Wiki Eintrag existiert leider auch nicht mehr.
Über eine simple Idee würde ich mich sehr freuen!

Gruß
sTaN
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Otto123

Hi,

Du bist hier im falschen Board, kannst Du bitte verschieben?

*** Keine Fragethemen starten! Board ist nur für funktionsfähigen Code! ***

https://forum.fhem.de/index.php/topic,47490.0.html

Ein möglicher Ansatz wäre deine Zeit Value("timeWeckersTaN") in Sekunden umzuwandeln timelocal() dann 15*60 davon abzuziehen und zurückwandeln in eine Zeitangabe. Ähnlich wie "Subtraktion vom aktuellen Zeitpunkt" in diesem Wiki https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sTaN

Mist, danke für die Info. Leider finde ich keine Möglichkeit den Beitrag zu verschieben.
Könnte dies bitte jemand oder ein Moderator in den Forumbereich Automatisierung verschieben?

Danke!
sTaN
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Otto123

ZitatMist, danke für die Info. Leider finde ich keine Möglichkeit den Beitrag zu verschieben.
erster Beitrag unten links
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sTaN

Ich sehe leider keine Möglichkeit (siehe Screenshots). Löschen kann ich ihn auch nicht, sonst hätte ich ihn fix neu erstellt und den hier gelöscht.
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Otto123

https://forum.fhem.de/index.php?topic=68904.0
Da ist wohl was mit dem Forum passiert :) geht bei mir auch nicht Stimmt nicht man darf den Beitrag nicht editieren sondern muss ganz nach unten scrollen!
Hast Du mein Edit in #1 gelesen?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

betateilchen

Zitat von: sTaN am 13 Februar 2021, 17:27:31
Ich sehe leider keine Möglichkeit (siehe Screenshots).

Der Verschieben Button ist viel weiter unten, siehe Screenshot.

Zitat von: sTaN am 13 Februar 2021, 17:27:31
Löschen kann ich ihn auch nicht, sonst hätte ich ihn fix neu erstellt und den hier gelöscht.

Löschen von Threads geht hier im Forum für User generell nicht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

sTaN

Zitat von: Otto123 am 13 Februar 2021, 17:32:00
https://forum.fhem.de/index.php?topic=68904.0
Da ist wohl was mit dem Forum passiert :) geht bei mir auch nicht Stimmt nicht man darf den Beitrag nicht editieren sondern muss ganz nach unten scrollen!

Ahhh. Ich habe scheinbar einen anderen Forum Skin. Über das + ganz unten links versteckt sich "Thread verschieben". Danke!

Aber endlich Back to Topic  :)

Zitat von: Otto123 am 13 Februar 2021, 17:32:00
Hast Du mein Edit in #1 gelesen?

Danke, der war mir bei dem Durcheinander leider entgangen. Ja den Wiki Beitrag hatte ich auch schon gefunden. Ich habe gehofft, ich könnte das direkt in meinem define des Notifys unterbringen, aber scheitere vermutlich immer an der Syntax, weshalb ich gehofft habe, es gibt eine einfachere Möglichkeit a la TimeOffset() oder wie bei sunset()...

EDIT:

Mein Versuch damit sah wie folgt aus:

statusWeckersTaN:.* {if (Value("statusWeckersTaN") eq "on") {my $timeWeckersTaN = Value("timeWeckersTaN");;fhem"defmod BA_Heizung_AutoOn at {POSIX::strftime($timeWeckersTaN ,localtime(time-15*60))} set WT_Bad desiredTemperature auto comfort ; set WT_Bad desiredTemperature auto"}}

Aber mit folgenden Fehlern:
2021.02.13 17:51:54 1:  ERROR evaluating my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART10=   $evalSpecials->{'%EVTPART10'};my $EVTPART11=   $evalSpecials->{'%EVTPART11'};my $EVTPART12=   $evalSpecials->{'%EVTPART12'};my $EVTPART13=   $evalSpecials->{'%EVTPART13'};my $EVTPART14=   $evalSpecials->{'%EVTPART14'};my $EVTPART15=   $evalSpecials->{'%EVTPART15'};my $EVTPART16=   $evalSpecials->{'%EVTPART16'};my $EVTPART17=   $evalSpecials->{'%EVTPART17'};my $EVTPART18=   $evalSpecials->{'%EVTPART18'};my $EVTPART19=   $evalSpecials->{'%EVTPART19'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $EVTPART20=   $evalSpecials->{'%EVTPART20'};my $EVTPART21=   $evalSpecials->{'%EVTPART21'};my $EVTPART22=   $evalSpecials->{'%EVTPART22'};my $EVTPART23=   $evalSpecials->{'%EVTPART23'};my $EVTPART24=   $evalSpecials->{'%EVTPART24'};my $EVTPART25=   $evalSpecials->{'%EVTPART25'};my $EVTPART26=   $evalSpecials->{'%EVTPART26'};my $EVTPART27=   $evalSpecials->{'%EVTPART27'};my $EVTPART28=   $evalSpecials->{'%EVTPART28'};my $EVTPART29=   $evalSpecials->{'%EVTPART29'};my $EVTPART3=   $evalSpecials->{'%EVTPART3'};my $EVTPART4=   $evalSpecials->{'%EVTPART4'};my $EVTPART5=   $evalSpecials->{'%EVTPART5'};my $EVTPART6=   $evalSpecials->{'%EVTPART6'};my $EVTPART7=   $evalSpecials->{'%EVTPART7'};my $EVTPART8=   $evalSpecials->{'%EVTPART8'};my $EVTPART9=   $evalSpecials->{'%EVTPART9'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{return undef; {if (Value("statusWeckersTaN") eq "on") {my $timeWeckersTaN = Value("timeWeckersTaN");;fhem"defmod BA_Heizung_AutoOn at {POSIX::strftime("$timeWeckersTaN ",localtime(time-15*60))} set WT_Bad desiredTemperature auto comfort ; set WT_Bad desiredTemperature auto"}}}: syntax error at (eval 15549400) line 1, near ""defmod BA_Heizung_AutoOn at {POSIX::strftime("$timeWeckersTaN "
2021.02.13 17:51:54 1:  PERL WARNING: (Missing operator before ",localtime(time-15*60))} set WT_Bad desiredTemperature auto comfort ; set WT_Bad desiredTemperature auto"?)
2021.02.13 17:51:54 1:  PERL WARNING: String found where operator expected at (eval 15549400) line 1, near "$timeWeckersTaN ",localtime(time-15*60))} set WT_Bad desiredTemperature auto comfort ; set WT_Bad desiredTemperature auto""
2021.02.13 17:51:54 1:  PERL WARNING: Scalar found where operator expected at (eval 15549400) line 1, near ""defmod BA_Heizung_AutoOn at {POSIX::strftime("$timeWeckersTaN"


Gruß
sTaN


Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Otto123

uiuiui
Ganz langsam: Was steht in Value("timeWeckersTaN")?
Dann das hier beachten https://fhem.de/commandref_DE.html#command
ZitatFür jede weitere Indirektion muss man die Strichpunkte verdoppeln.
Dann nicht defmod sondern modify verwenden. Du willst doch ein existierendes at ändern oder ein neues anlegen?

Und der Befehl {POSIX::strftime("%H:%M:%S",localtime(time-45*60))} hat vorn eine Formatangabe, da hat Dein Reading nix zu suchen! Du musst den Wert für time liefern in sekunden. Also Deine Zeit kommt anstatt time!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sTaN

Zitat von: Otto123 am 13 Februar 2021, 18:01:14
uiuiui
Ganz langsam: Was steht in Value("timeWeckersTaN")?

Das ist der Dummy timeWeckersTaN, der über den Siri Kurzbefehl gesetzt wird und die iPhone Wecker Uhrzeit bekommt z.B.: 06:00:00.

Zitat von: Otto123 am 13 Februar 2021, 18:01:14
Dann das hier beachten https://fhem.de/commandref_DE.html#command
Dann nicht defmod sondern modify verwenden. Du willst doch ein existierendes at ändern oder ein neues anlegen?

Mit modify ändert er mir aber nicht die Uhrzeit des AT, dass passiert nur bei defmod. Ich habe es so verstanden, dass ich in meinem Notify "Notify_BA_Heizung_AutoOn", ja nur temporär das AT "BA_Heizung_AutoOn" anlege, sobald der Dummy statusWeckersTaN sich ändert, weshalb ich nach dem AT und vor dem $timeWeckersTaN auch kein + setze, damit er es nicht in die fhem.cfg schreibt, sondern nur in state. So war zumindest mein Verständnis.

Siehe Screenshot sieht momentan das funktionierende Notify, mit den aktuellsten Werten aus.

Gruß
sTaN
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Otto123

Also modify ändert doch gerade die Uhrzeit? https://fhem.de/commandref_DE.html#modify
Aber egal, Du hast nur eine Zeit Du brauchst noch das Datum und dann erzeugst Du z.B. mit
Zitattimelocal(<Sekunden>, <Minuten>, <Stunden>, <Tag des Monats>, <Monat>, <Jahr>) wandelt einen Satz von Zeitelementen (Sekunden, Minuten, Stunden usw.) in Sekunden um [3]
Die "Sekunden" der Weckzeit.

Oder Du nimmst einfach diese Zeit 06:00:00 und errechnest die Sekunden
Alles für den Test in der Kommandozeile
{my $val="06:00:00");;(split(":",$val))[0]*3600+(split(":",$val))[1]*60+(split(":",$val))[2]}
Und subtrahierst die 15*60
{my $val=Value("timeWeckersTaN");;(split(":",$val))[0]*3600+(split(":",$val))[1]*60+(split(":",$val))[2]-15*60}
Und machst daraus die neue Zeit
{my $val="06:00:00";;my $sec=(split(":",$val))[0]*3600+(split(":",$val))[1]*60+(split(":",$val))[2]-15*60;;my $result=POSIX::strftime("%H:%M:%S",gmtime($sec))}

Das funktioniert aber nicht direkt im at, das müsstest Du als Sub auslagern (es dürfen keine Leerzeichen im Code sein!):
define test_zeit at {POSIX::strftime("%H:%M:%S",gmtime((split(":","06:00:00"))[0]*3600+(split(":","06:00:00"))[1]*60+(split(":","06:00:00"))[2]-15*60))} {}

Aber das kann schief gehen wenn Du früh aufstehst!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sTaN

Zitat von: Otto123 am 13 Februar 2021, 18:34:11
Oder Du nimmst einfach diese Zeit 06:00:00 und errechnest die Sekunden
Alles für den Test in der Kommandozeile
{my $val="06:00:00");;(split(":",$val))[0]*3600+(split(":",$val))[1]*60+(split(":",$val))[2]}
Und subtrahierst die 15*60
{my $val=Value("timeWeckersTaN");;(split(":",$val))[0]*3600+(split(":",$val))[1]*60+(split(":",$val))[2]-15*60}
Und machst daraus die neue Zeit
Aber das kann schief gehen wenn Du früh aufstehst!

Wao Otto, danke für deine Geduld und Mühe. Daran merke ich immer wieder, dass ich trotz commandref lesen, die verschachtelte Syntax mit Perl nicht verstanden habe und mich damit wahnsinnig schwer tue. Ich scheitere sogar daran, deinen vorbereiteten Code in mein Notify einzubauen!  :-[

Beim Versuch folgendes zu bauen:
statusWeckersTaN:.* {if (Value("statusWeckersTaN") eq "on") {my $timeWeckersTaN = Value("timeWeckersTaN");;fhem"defmod BA_Heizung_AutoOn at {POSIX::strftime("%H:%M:%S",my $val=Value("timeWeckersTaN");;(split(":",$val))[0]*3600+(split(":",$val))[1]*60+(split(":",$val))[2]-15*60))} set WT_Bad desiredTemperature auto comfort ; set WT_Bad desiredTemperature auto"}}

Erhalte ich folgenden Fehler:
syntax error at (eval 28994) line 1, near "H:"
Global symbol "%M" requires explicit package name (did you forget to declare "my %M"?) at (eval 28994) line 1.
Global symbol "%S" requires explicit package name (did you forget to declare "my %S"?) at (eval 28994) line 1.
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Otto123

Du scheiterst daran: Achtung: {perlfunc()} darf keine Leerzeichen enthalten.
Siehe mein Edit oben.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sTaN

Otto du bist mein Held!!! Nachdem du deinen Beitrag editiert hast, konnte ich den Code erfolgreich implementieren und es funktioniert!!!

statusWeckersTaN:.* {if (Value("statusWeckersTaN") eq "on") {my $val=Value("timeWeckersTaN");;my $sec=(split(":",$val))[0]*3600+(split(":",$val))[1]*60+(split(":",$val))[2]-15*60;;my $result=POSIX::strftime("%H:%M:%S",gmtime($sec));;fhem"defmod BA_Heizung_AutoOn at $result set WT_Bad desiredTemperature auto comfort ; set WT_Bad desiredTemperature auto"}}

Genial!!! Ich hätte wirklich gedacht es geht einfacher, aber immerhin es funktioniert!

Gruß
sTaN
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

Otto123

übersichtlicher wird es wenn Du einfach ein userReadings in deinem Dummy machst, der mit diesem perlCode von der Zeit die 15 min abzieht?. Dann machst das notify mit diesem userReadings?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz