FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Skusi am 07 Juni 2020, 10:47:13

Titel: ***gelöst*** Zeiten addieren aber ohne Sekunden
Beitrag von: Skusi am 07 Juni 2020, 10:47:13
Hallo,
ich möchte eine Startzeit für meinen Mähroboter um eine zweite Zeitangabe verschieben.

Dazu habe ich mir eine Funktion aus meiner MyUtils gegriffen:
# Offset in Minuten auf Zeitstamp addieren/subtrahieren
sub
time_offset
{
  # Eingangs-Zeitstempel in Variable holen
  my ($timestamp) = shift;

  # Offset (in Sekunden) in Variable speichern
  my ($offset) = shift;

  # Zeitstempel in das interne Format konvertieren: 17:30:09 ==> 17.5025
  # Stunden werden als ganze Zahlen gespeichert, minuten als 1/60 und sekunden als 1/3600
  my ($t) = hms2h($timestamp);

  $t += $offset/60;

  # Zurück in HH:MM:SS konvertieren.
  return h2hms_fmt($t);
};


Das Problem ist nur das der Rückgabewert immer mit Sekunden ausgegeben wird. Also z.B 13:45:00
So kann ich das aber nicht weiter verarbeiten. Wie bekomme ich die Funktion umgebaut das Sie ohne Sekunden rechnet ?
Gibt es den Befehl h2hms_fmt() auch ohne Skunden Berücksichtigung?

Oder wie kann ich das Ergebniss 13:45:00 auf 13:45 umformatieren ?

Über die Suche habe ich leider nix griffiges gefunden.

Gruß Skusi
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Otto123 am 07 Juni 2020, 11:35:04
Hi,

vielleicht hilft Dir dieser Artikel im Wiki?
https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit

Gruß Otto
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Skusi am 09 Juni 2020, 20:43:14
Hallo Otto,
danke für den Tipp, warum auch immer ich dieses Seite im Wiki nicht selber gefunden habe.

Hab das kurz überflogen und auf einen Zeitpunkt mit mehr Zeit und Ruhe verschoben. Sieht für meinen Wissensstand sehr anspruchsvoll aus, aber ich denke da lässt sich was draus konstruieren.

Gruß Skusi
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Otto123 am 09 Juni 2020, 20:48:57
:)
ich kenne die Funktion  h2hms_fmt() nicht. Die klingt aber so nach hour minute sec.
Bevor ich eine Funktion verwende die ich nicht versteh und nicht beeinflussen kann (vielleicht gibt es h2hm_fmt()) würd ich es zu Fuß machen. strftime()

Wenn Du sekunden hast (immer eine gute Idee dahin "zurück" zu gehen) ist es einfach :) und es geht alles.

Gruß Otto
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Skusi am 11 Juni 2020, 11:08:33
Mir raucht der Kopf,
ich Sitz hier nun schon fast 2 Std und versuche was zu konstruieren das mit ein Reading 12:00 um ein Reading 02:00 verschiebt und das Ergebnis in ein weiteres Reading schreibt.

Bin ich zu blöd zu. Ich hab schon alles Mögliche aus dem Wiki ausprobiert und kombiniert, aber nicht will richtig funzen.
Die Funktionen erwarten immer einen Zeitstempel den ich nicht habe. Die Readings die ich verrechnen will haben natürlich nicht den Zeitstempel Ihres Wertes.
Also wie kann ich denn einen String "12:00" in Sekunden wandeln damit ich ihn mit "02:00" addieren kann?

{((timelocal(ReadingsVal("Maeplan_Edward", "Startzeit_heute","0"))) + timelocal(ReadingsVal("Rasen_noch_feucht", "Maehverzoegerung","0")))})

Soweit bin ich nun, aber es hapert an den fehlenden Datums Angabe, die ich aber nicht habe/brauche.

Startzeit_heute = 12:00
Maehverzoegerung = 02:00

Help me....
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Otto123 am 11 Juni 2020, 11:32:21
Für den Anfang
{(split(":","12:00"))[0]}
{(split(":","12:00"))[1]}
Für zwischendurch
{(split(":","12:00"))[0]*3600}
Fürs Finale:
{strftime("%H:%M",localtime(3600))}

Kommst Du damit klar? Wenn ja würde ich davon noch was ins Wiki schreiben :)
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: MadMax-FHEM am 11 Juni 2020, 11:38:27
Also wenn deine Zeiten tatsächlich IMMER so kommen könnte das funktionieren:


{(split(/:/,"12:00"))[0] * 60 * 60 + (split(/:/,"00:02"))[0] * 60}


Bzw. wenn die Mähverzögerung so ist (sind das Stunden!?), dann:


{(split(/:/,"12:00"))[0] * 60 * 60 + (split(/:/,"00:02"))[0] * 60 * 60}


Wenn du alles willst und alles Stunden/Minuten sind:


{(split(/:/,"12:00"))[0] * 60 * 60 + (split(/:/,"00:02"))[1] * 60}


EDIT: äh die Beispiele "oben" sind nat. nur zur "Veranschaulichung" und nicht wirklich "korrekt", weil du verm. das "unten" haben wolltest!? ;)

Also dann mit Readingsval (sollte gehen!?):


{(split(/:/,ReadingsVal("Maeplan_Edward", "Startzeit_heute","0"))[0] * 60 * 60 + (split(/:/,ReadingsVal("Maeplan_Edward", "Startzeit_heute","0"))[1] * 60 + (split(/:/,ReadingsVal("Rasen_noch_feucht", "Maehverzoegerung","0"))[0] * 60 * 60 + (split(/:/,ReadingsVal("Rasen_noch_feucht", "Maehverzoegerung","0"))[1] * 60}


Damit hast du schon mal nur alles addiert in Sekunden... ;)

Geht bestimmt auch anders (ist immer so ;)  ) aber das erschien mir am Einfachsten ;)

"Rückwärst" geht dann mit Teilen und Modulo usw. ;)

EDIT: Mist!! Zu langsam getippelt ;)

Gruß, Joachim
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Otto123 am 11 Juni 2020, 11:42:39
Zitat von: MadMax-FHEM am 11 Juni 2020, 11:38:27
EDIT: Mist!! Zu langsam getippelt ;)
Wir sollten unbedingt mal beim "Bier" rausfinden ob wir uns da auch so gut verstehen ;)
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Damian am 11 Juni 2020, 11:43:24
Zitat von: Skusi am 11 Juni 2020, 11:08:33
Mir raucht der Kopf,
ich Sitz hier nun schon fast 2 Std und versuche was zu konstruieren das mit ein Reading 12:00 um ein Reading 02:00 verschiebt und das Ergebnis in ein weiteres Reading schreibt.

Bin ich zu blöd zu. Ich hab schon alles Mögliche aus dem Wiki ausprobiert und kombiniert, aber nicht will richtig funzen.
Die Funktionen erwarten immer einen Zeitstempel den ich nicht habe. Die Readings die ich verrechnen will haben natürlich nicht den Zeitstempel Ihres Wertes.
Also wie kann ich denn einen String "12:00" in Sekunden wandeln damit ich ihn mit "02:00" addieren kann?

{((timelocal(ReadingsVal("Maeplan_Edward", "Startzeit_heute","0"))) + timelocal(ReadingsVal("Rasen_noch_feucht", "Maehverzoegerung","0")))})

Soweit bin ich nun, aber es hapert an den fehlenden Datums Angabe, die ich aber nicht habe/brauche.

Startzeit_heute = 12:00
Maehverzoegerung = 02:00

Help me....

Es hängt davon ab, welches Modul du für das Setzen der Timer benutzt.

Beim DOIF z. B. brauchst du dir da keine Gedanken machen

DOIF ([([Maeplan_Edward:Startzeit_heute]+[Rasen_noch_feucht:Maehverzoegerung])])...

Hier wird sogar die Zeit sofort neuberechnet, wenn du eines der Readings änderst - ein weiterer Eventhandler entfällt
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: MadMax-FHEM am 11 Juni 2020, 11:46:52
Zitat von: Otto123 am 11 Juni 2020, 11:42:39
Wir sollten unbedingt mal beim "Bier" rausfinden ob wir uns da auch so gut verstehen ;)

Aktuell schwierig...

Es müsste verm. irgendwo zwischen Nbg und Leipzig sein!?

Wobei ich ja ab und an an Leipzig vorbei komme...
...gut vor Corona bin...

Wenn ich mal wieder nach Leipzig komme gebe ich Bescheid...
...könnte aber dauern...

Gruß, Joachim
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Christoph Morrison am 11 Juni 2020, 11:53:10
Mach mal bitte ein list von Maeplan_Edward und Rasen_noch_feucht.
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: betateilchen am 11 Juni 2020, 11:54:39
Zitat von: Skusi am 07 Juni 2020, 10:47:13
Oder wie kann ich das Ergebniss 13:45:00 auf 13:45 umformatieren ?


  $t += $offset/60;

  # Zurück in HH:MM konvertieren.
  my ($h,$m,$s) = h2hms($t);
  return sprintf("%02d:%02d", $h, $m);
};

Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: betateilchen am 11 Juni 2020, 11:55:37
Zitat von: MadMax-FHEM am 11 Juni 2020, 11:46:52
Wenn ich mal wieder nach Leipzig komme gebe ich Bescheid...
...könnte aber dauern...

Nach jetziger Planung bin ich vom 12.-15.10. in Leipzig  8)
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Skusi am 13 Juni 2020, 09:57:17
Erstmal sehr vielen Dank für die reichhaltigen Lösungsansätze an Alle Beteiligten.
Da fällt die Wahl schon fast schwer. ;)

Ich doktor gerade mit der Split Lösung herum.

Stolpere aber gerade etwas:
Warum ergibt {(strftime("%H:%M",localtime(0)))}
01:00 ?
Das Ergebnis aus sekunden ist immer + 01:00
Warum ?
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Otto123 am 13 Juni 2020, 10:57:30
Weil localtime sich auf die "Geburt" der Computerzeitrechnung bezieht:
Thu Jan 1 01:00:00 1970

Hab ich nicht bedacht, sorry. Geht dann doch bloß für relative Zeitangaben für den aktuellen Zeitpunkt.
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Skusi am 13 Juni 2020, 16:16:13
Ich habs nun endlich hingepuzzelt bekommen.
Dank an alle, von jedem hat etwas geholfen.

Die eine Stunde Versatz habe ich einfach bei der Sekunden zusammenrechnung wieder abgezogen. So passt das Ergebnis jetzt.

Falls es jemanden Interessiert, ist das End Produkt  DOIF nun so geworden:

defmod Edward_Maehverzoegerung DOIF ([([Maeplan_Edward:Startzeit_heute]-[00:10])|] and [Rasen_noch_feucht:Trockenzeit] > 0) \
\
(setreading Maeplan_Edward Startzeit_heute_verzoegert {(strftime("%H:%M",localtime(\
((split(":",ReadingsVal("Maeplan_Edward","Startzeit_heute","0")))[0] * 3600) + (split("":"",ReadingsVal("Maeplan_Edward","Startzeit_heute","0")))[0] * 60) + \
ReadingsVal("Rasen_noch_feucht","Trockenzeit",0)))},\
\
set Edward changeCfgCalendar [Wochentag],[Maeplan_Edward:Startzeit_heute_verzoegert],120,0)
attr Edward_Maehverzoegerung disable 0
attr Edward_Maehverzoegerung do always
attr Edward_Maehverzoegerung group Rasen
attr Edward_Maehverzoegerung room 7.1_Garten


Damit wird 10 Minuten vor Ausfahrt des Mähers die Startzeit verschoben falls der Rasen vom letzten Regenguss noch nass sein könnte.

Die Trockenzeit wird in einem anderen DOIF anhand eines Regensensors und dem letzten Impuls ermittelt.

defmod Rasen_noch_feucht DOIF ([Niederschlag:rain_now_diff] > 0) \
\
(setreading $SELF Trockenzeit 7200)\
\
DOELSEIF ([Niederschlag:rain_now_diff] == 0 and [?$SELF:Trockenzeit] > 0) \
(setreading $SELF Trockenzeit {([$SELF:Trockenzeit] -900)})
attr Rasen_noch_feucht do always
attr Rasen_noch_feucht group Rasen
attr Rasen_noch_feucht room 7.1_Garten
attr Rasen_noch_feucht stateFormat Maehverzoegerung
attr Rasen_noch_feucht userReadings Maehverzoegerung:Trockenzeit.* { strftime('%H:%M', gmtime(ReadingsNum($NAME, "Trockenzeit", 0))) }
attr Rasen_noch_feucht wait 0:900


Derzeit Zählt dieses DOIF alle 15 Minuten die Trockenzeit in sekunden runter, wenn kwin weiterer Regen fällt.

Vielen Dank besonders an Otto, die Split Geschichte war ein guter Tipp. Den Befehl kannte ich noch nicht.

Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: fiedel am 14 Juni 2020, 09:36:38
Zitat von: Skusi am 13 Juni 2020, 09:57:17
Erstmal sehr vielen Dank für die reichhaltigen Lösungsansätze an Alle Beteiligten.
Da fällt die Wahl schon fast schwer. ;)

Ich doktor gerade mit der Split Lösung herum.

Stolpere aber gerade etwas:
Warum ergibt {(strftime("%H:%M",localtime(0)))}
01:00 ?
Das Ergebnis aus sekunden ist immer + 01:00
Warum ?

Das Problem hatte ich vor Kurzem auch bei einer Umrechnung von Sekunden in das Zeitformat für "at"- Befehle:
Die Lösung kam von @Otto123: nimm "gmtime" statt "localtime".  :)

Gruß Frank
Titel: Antw:Zeiten addieren aber ohne Sekunden
Beitrag von: Otto123 am 28 Juni 2020, 11:28:30
Zitat von: fiedel am 14 Juni 2020, 09:36:38
Die Lösung kam von @Otto123: nimm "gmtime" statt "localtime".  :)
Peinlich das man solche Dinge wieder nach einer Weile wieder vergisst - ich hoffe es liegt noch nicht am Alter😵
Mal schauen, dass ich davon noch was ins Wiki packe ;)
Titel: Antw:***gelöst*** Zeiten addieren aber ohne Sekunden
Beitrag von: fiedel am 29 Juni 2020, 08:43:11
Das ist völlig normal. Ich staune beim lesen alter Posts auch manchmal, was ich alles schon mal gewusst hatte...  :o