mit zeiten rechnen

Begonnen von the ratman, 09 September 2016, 11:53:22

Vorheriges Thema - Nächstes Thema

the ratman

hiho

langsam geh ich die verfeinerungen bei fhem an.
darunter nun: meine holde soll eine uhrzeit für die reinigungsfahrten unseres saugroboters festlegen können. 5 min vor der fahrt kommt dann nochmal eine meldung, die entsprechenden türen zu schließen, damit der bot nur fährt, wo er soll. weibchen ist da sehr eigen ...

die uhrzeit stellt sie per dummy ein, der das format HH:MM in seinem state speichert. den bot zu der zeit starten zu lassen ist mal kein problem.
das problem ist die warnmeldung, die 5 min. vorher raus soll. wie kann ich mit der uhrzeit des dummys - z.b. 17:00 rechnen, um mein 16:55 uhr für die meldung zu bekommen?
zur zeit hab ich noch feste zeiten drinnen, der bot fährt um 17 uhr los, drum kommt die warnung "hardgecodet" um 16:55  [16:55|012345](jaja, wochentage muß ich dann auch noch machen, aber alles der reihe nach *g*)
→do↑p!dnʇs↓shit←

JoWiemann

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

KernSani

RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

rapster

Evtl. hilft dir die Funktion time_str2num() aus der 99_Utils.pm;
{ time_str2num( TimeNow() ) }

Habe mir in der myUtils noch eine Funktion in die Gegenrichtung angelegt:
sub time_sec2hms($) {
    my $s = shift;
    my $m = $s / 60;
    $s = $s % 60;
    my $h = $m / 60;
    $m %= 60;
    return sprintf("%02d:%02d:%02d", $h, $m, $s) if($h < 24);
    my $d = $h / 24;
    $h %= 24;
    return sprintf "%d:%02d:%02d:%02d", $d, $h, $m, $s;
}

{ time_sec2hms( time_str2num(TimeNow()) ) }

the ratman

#4
@JoWiemann
das hab ich auch gefunden, sagt mir nur überhaupt nix ...

@KernSani
das problem ist ja, dass ich nicht von der aktuellen uhrzeit, sondern von einer in nem dummy stehenden ausgehen muß.

oder wär das echt so einfach?
ist das richtig? --> [[dummyzeit]-[:05]]
nö, oder?

@rapster - ich und perl? *g*
→do↑p!dnʇs↓shit←

JoWiemann

Aus einem älteren Post, gefunden durch googeln:


my $NextAlarmTime = ReadingsVal("dein dummy", "state", "00:00");

# Die 5 Minuten, können auch in einem weiteren Dummx sein
my  $Poffset = -5; # oder my  $Poffset = ReadingsVal("dein dummy abzuziehen", "state", "00:00");

# Zur Übernahme des Datums und der Zeit von heute:   
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;

#  Nun umgekehrt die zu verändernde Stunde und Minute (z.B. Weckzeit) einspielen. Steht bei mir in $NextAlarmTime als hh:mm:
my $NextAlarmTimeP = mktime(0,substr($NextAlarmTime,3,2),substr($NextAlarmTime,0,2),$mday,$month,$year,$wday,$yday,$isdst);

# Die Zeitverschiebung berechnen. Steht bei mir in $Poffset (als Minuten):
my $NextAlarmTimePM = $NextAlarmTimeP + $Poffset * 60;

# Nun wieder zurück in Stunde und Minute etc. umändern:
my ($Psec,$Pmin,$Phour,$Pmday,$Pmonth,$Pyear,$Pwday,$Pyday,$Pisdst) = localtime($NextAlarmTimePM);

# Jetzt noch in eine Uhrzeit konvertieren. Tag, Monat und Jahr müsste auch richtig berechnet werden:

my $NextAlarmTimePHM = $Phour.':'.$Pmin;



Das Ergebnis nun mit fhem(set ...) dahin bringen, wo es benötigt wird.
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

fiedel

Hier auch noch ein hoffentlich recht verständliches Beispiel.
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

betateilchen

#7
Da hab ich auch noch was...

Folgende Funktion in die 99_myUtils.pm packen:


sub timeAdd($$){
   my ($t,$offset) = @_;
   my @t = split(/:/,$t);
      $t[2] //= 0;
   my $s = $t[0]*3600 + $t[1]*60 + $t[2] + $offset;

   return sprintf("%02d:%02d:%02d", $s/3600, ($s/60)%60, $s%60);
}


dann in der fhem Befehlszeile eingeben:

{timeAdd('17:00',-300)}

und sich darüber freuen, dass 16:55:00 rauskommt :)

Das Ganze funktioniert auch mit dem Eingabeformat hh:mm:ss für die Ausgangszeit.

Einziges Manko: rund um Mitternacht klappt das Ganze nicht. Aber bei Staubsaugern ist das wohl eher unkritisch.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

KernSani

Zitat von: the ratman am 09 September 2016, 12:10:51
oder wär das echt so einfach?
ist das richtig? --> [[dummyzeit]-[:05]]
nö, oder?
Doch so einfach :-) ich glaube die Klammern sitzen in deinem Coding nicht ganz richtig. Gibt sogar ein Beispiel in der Doku (Lampe eine Stunde vor [Dummy] ausschalten).
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

the ratman

#9
thx KernSari
dann werd ich mal mit klammern um mich werfen, bis es geht *g*

nachtrag: ne, is leider doch nicht gar so einfach scheints. muß ich wohl doch wieder mal ne perl-abschreibübung ohne kapieren machen ...
zumindest krieg ich betateilchens kreuzworträtsel mal zum laufen *g* thx dafür betateilchen! und auch die anderen helfer danke!
Zitat von: betateilchen am 09 September 2016, 12:57:07
Da hab ich auch noch was...

Folgende Funktion in die 99_myUtils.pm packen:


sub timeAdd($$){
   my ($t,$offset) = @_;
   my @t = split(/:/,$t);
      $t[2] //= 0;
   my $s = $t[0]*3600 + $t[1]*60 + $t[2] + $offset;

   return sprintf("%02d:%02d:%02d", $s/3600, ($s/60)%60, $s%60);
}


dann in der fhem Befehlszeile eingeben:

{timeAdd('17:00',-300)}

und sich darüber freuen, dass 16:55:00 rauskommt :)

Das Ganze funktioniert auch mit dem Eingabeformat hh:mm:ss für die Ausgangszeit.

Einziges Manko: rund um Mitternacht klappt das Ganze nicht. Aber bei Staubsaugern ist das wohl eher unkritisch.

allerdings funzt die sache doch nicht wirklich

der dummy sieht so aus: homObot_Uhrzeit    17:00     dummy
ein [[homObot_Uhrzeit]|012345] ergibt brav 09.09.2016 17:00:00|012345
aber [{timeAdd('[homObot_Uhrzeit]',-300)}|012345] ergibt leider blödsinn a'la 10.09.2016 00:55:00|012345

geb ich {timeAdd('17:00',-300)} "nur" in die befehlszeile ein, kommt aber koreckt 16:55 raus
geb ich {timeAdd('[homObot_Uhrzeit]',-300)} ein, kommt auch in der befehlszeile 00:55:00 raus
→do↑p!dnʇs↓shit←

KernSani

Zitat von: the ratman am 09 September 2016, 16:14:10
thx KernSari
dann werd ich mal mit klammern um mich werfen, bis es geht *g*

nachtrag: ne, is leider doch nicht gar so einfach scheints. muß ich wohl doch wieder mal ne perl-abschreibübung ohne kapieren machen ...


Habe mal mit Klammern um mich geworfen... Folgendes funktioniert:
Internals:
   CFGFN
   DEF        ([([clockTimer]-[00:05])])()
   NAME       rechne_mit_Zeit
   NR         12651
   NTFY_ORDER 50-rechne_mit_Zeit
   STATE      initialized
   TYPE       DOIF
   Readings:
     2016-09-09 16:50:31   cmd             0
     2016-09-09 16:50:31   state           initialized
     2016-09-09 16:50:31   timer_1_c1      10.09.2016 06:10:00

Wie Du siehst steht das timer reading auf 06:10

Mein Wecker (clockTimer) steht auf 06:15 (eklige Zeit):
Internals:
   NAME       clockTimer
   NR         325
   STATE      06:15
   TYPE       dummy
   Readings:
     2016-09-07 21:39:45   state           06:15


Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

the ratman

#11
ahh, na ich hab ja auch nur [:05] genommen, scheints will der gute dann also auch stunden haben. dachte ich, aus der ref anders rausgelesen zu haben bei den doif's ..

na dann probier ichs nochmal so, allerdings würd mich jetzt durchaus auch die komische zeit bei betateilchens konstrukt interessieren.
ich nehm mal an, ich muß meinen dummy anders da rein arbeiten, weiß aber wieder mal nicht wie ...


nachtrag: funzt: [([homObot_Uhrzeit]-[00:05])|012345]
nachdem das perl-freie zone ist, werd ichs wohl so lassen. sonst steh ich in nem jahr wieder mit blöden fragen da, wenn ich was ändern wollen würde *g*.

nochmal vielen dank an die beteiligten hier!
→do↑p!dnʇs↓shit←

sash.sc

Mit dem berechnen von Zeiten im Bedigungsteil des DOIF  klappt, nur nicht im befehlsteil. Hatte da auch schonmal nachgefragt.

Gruß Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

KernSani

Zitat von: the ratman am 09 September 2016, 16:58:39
ich nehm mal an, ich muß meinen dummy anders da rein arbeiten, weiß aber wieder mal nicht wie ...
Perl kennt kein [Device], da musst du mit
ReadingsVal("DeviceName","state",0) arbeiten...

Zitat von: sash.sc am 09 September 2016, 16:59:04
Mit dem berechnen von Zeiten im Bedigungsteil des DOIF  klappt, nur nicht im befehlsteil. Hatte da auch schonmal nachgefragt.
Stimmt... aber im konkreten Fall ist es ja in der Bedingung notwendig...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

the ratman

muß ich schon wieder nerven ...

jetzt hab ich meine zeit ja im griff dank euch, dachte ich, ich geh die wochentagssteuerung an.
da will ich auch mit nem dummy arbeiten, der einfach im state die tage trägt (wie ich den dann befülle, werden wir sehen, derzeit mach ich das noch "händisch") - z.b. sieht der state denn wie "012345" aus.
das steht im doif unter "Probably associated with" auch richtig drinnenhomObot_Wochentag 012345 dummy

nächster schritt: ich dachte, ich kann das dummy-device einfach im doif einbauen - z.b.:[?([homObot_Uhrzeit]-[00:05])|[homObot_Wochentag]-([homObot_Uhrzeit]+[00:55])|[homObot_Wochentag]]dabei kommt dummer weise aber folgendes raus:timer_1_c1      10.09.2016 16:55:00|[homObot_Wochentag] 2016-09-10 12:49:18
timer_2_c1 10.09.2016 17:55:00|[homObot_Wochentag] 2016-09-10 12:49:18


was mach ich den nu scho wieder falsch?
→do↑p!dnʇs↓shit←