Umrechnung Sekunden in Minuten und Endzeitangabe

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von Arthy » 18.02.2019, 11:04

Hallo zusammen,

ich habe folgendes Problem, beim Auslesen der Druckzeiten aus Octoprint bekomme ich diese nur in Sekunden dargestellt. Da es sich auch öfters um längere Drucke handelt, dauert es schon mal einige Stunden. Daher würde ich gerne der Übersicht halber die Sekunden in Stunden, Minuten und Sekunden umrechnen und in eine Systemvariable speichern. Dann ausgeben zum Beispiel als "Der Druck dauern noch hh:mm:ss".
Des Weiteren würde ich auch gerne zusätzlich direkt die Endzeit in eine Systemvariable ausgeben. Hier müsste ich dann wahrscheinlich mit totime arbeiten. Ich könnte schwören ich habe hier letzte Woche einen Beitrag gefunden, der genau diese Sachen thematisiert hat, finde ich aber irgend nicht mehr. Kann mir da einer eventuell helfen.
Besten Dank

Gruß
Arthy

dtp
Beiträge: 10660
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 321 Mal
Danksagung erhalten: 501 Mal

Re: Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von dtp » 18.02.2019, 11:45

Vielleicht hilft dir mein kleines Skript in diesem Beitrag etwas weiter.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

Re: Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von Arthy » 18.02.2019, 13:53

Hallo,

Dankeschön dtp für die Antwort, das mit der Duration ist ein Ansatz. Ich habe mir das bezüglich dem ersten Teil der Umrechnung in der Theorie so vorgestellt:

Dauer z.B.: 4000 s
Restdivision in s: 4000%60 = 40 s
Volle Minuten: (4000-40)/60 = 66 min
Restdivision in min: 66%60 = 6 min
Volle Stunden: (66-6)/60= 1 h

Da ich mich in der Scriptsprache nicht so auskenne, weiß ich nicht wie ich das am besten in die gewünschte Darstellungsform in eine Systemvariable einfüge (hh:mm:ss -> 01:06:40 ="Volle Stunden:Restdivision(in min):Restdivision (in s)").

Gruß
Arthy

Bratmaxe
Beiträge: 1573
Registriert: 28.05.2015, 12:48
Wohnort: Willich
Hat sich bedankt: 4 Mal
Danksagung erhalten: 10 Mal

Re: Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von Bratmaxe » 18.02.2019, 15:40

Wie wäre es mit so einer Berechnung? Vielleicht hilft dir das auch?

Code: Alles auswählen

! Rückgabewert in Sekunden
integer sek = 4000;

! Jetzt-Zeit in Variable schreiben
time now = system.Date("%F %T").ToTime();

! Endzeit berechnen
time Ende = now + sek.ToTime();
! Endzeit ausgeben
WriteLine("Ende: " # Ende);

! Dauer berechnen in H
time dauer = sek.ToTime();
! Sommerzeit beachten, da es hier eine Zeitrechnung ist und keine echte Stundenrechnung
if (system.Date("%F").ToTime().IsDST() == 0)
{
  ! Wenn Winterzeit, dann 1 Stunde abziehen!
  dauer = dauer - 3600; 
}

! Dauer ausgeben
WriteLine("Dauer: " # dauer.Format("%H:%M:%S"));
Gruß Carsten

Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

Re: Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von Arthy » 19.02.2019, 00:53

Hi Bratmaxe,

das Skript hat mir super geholfen, besten Dank. Habe es auch schon entsprechend angepasst. Habe nur ein kleines Problem. Hole mir die Zeit aus einer Systemvariable namens octoprint_printTime. Diese ist wie man der Ausgabe unten entnehmen kann 6595.000000 (Sekunden). Damit bekomme ich mit dem Skript zwar die korrekte Endzeit ausgegeben, die Dauer des Drucks zeigt er mir jedoch nicht an. Habt ihr eine Idee warum dies nicht funktioniert? Setze ich eine feste Variable manuell auf diesen Wert funktioniert das Ganze seltsamerweise.
Vielen Dank

Gruß
Arthy

Code: Alles auswählen

! Rückgabewert in Sekunden
var sek = dom.GetObject("octoprint_printTime");
WriteLine("sek: " # sek.Variable());

! Jetzt-Zeit in Variable schreiben
time now = system.Date("%F %T").ToTime();

! Endzeit berechnen
time Ende = now + sek.ToTime();
string endTime = Ende.Format("%H:%M:%S"); ! Ausgabe in hh:mm:ss

! Endzeit ausgeben
WriteLine("Ende: " # endTime);
dom.GetObject("octoprint_endTimeTest").State(endTime);! endTimeTest ist die Systemvariable

! Dauer berechnen in H
time dauer = sek.ToTime();
! Sommerzeit beachten, da es hier eine Zeitrechnung ist und keine echte Stundenrechnung
if (system.Date("%F").ToTime().IsDST() == 0)
{
  ! Wenn Winterzeit, dann 1 Stunde abziehen!
  dauer = dauer - 3600; 
}

! Dauer ausgeben
WriteLine("Dauer: " # dauer.Format("%H:%M:%S"));
dom.GetObject("octoprint_printTimeLeftTest").State(dauer.Format("%H:%M:%S"));

Code: Alles auswählen

sek: 6595.000000
Ende: 02:26:10
Dauer: 

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von alchy » 19.02.2019, 07:18

sek in Zeile 2 ist im besten Fall der Name des Objektes aber nicht dessen Wert. Zeile 3 Gibt dann zwar den Wert aus
(ich würde auch .Variable() jedoch komplett verzichten und immer auf .Value() zum Lesen bz. .State() zum Schreiben von Werten greifen.)

Jedenfalls lässt sich mit einem String wie octoprint_printTime nicht rechnen. z:B. dann gleich in

Code: Alles auswählen

time Ende = now + sek.ToTime();
und es sollte auch ein ScriptRuntimeError im Fehlerprotokoll erzeugt werden.

Dein gepostetes Script darf eigentlich nur

Code: Alles auswählen

sek: 6595.000000
ausgeben. Habs aber nicht getestet.
Lösung ist also erstmal auf den Wert des Objektes zuzugreifen vor Wandlung in eine Zeit oder Rechnen.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Benutzeravatar
Black
Beiträge: 5480
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von Black » 19.02.2019, 08:23

auf die schnelle in Quick & dirty, kannst du ja anpassen nach Bedarf:

Code: Alles auswählen

real Laufzeit= 1200.0;
WriteLine ("Laufzeit: " # (Laufzeit.ToTime () -3600).Format ("%H:%M:%S"));
WriteLine ("Fertig  : " # (localtime+Laufzeit).Format ("%H:%M:%S")); 
Laufzeit muss du mit dem Inhalt des Wertes aus dem Drucker vorbesetzen.

Dann werfen dir diese beiden Zeilen Laufzeit formatiert und Endzeit aus.
Wen die in Sysvars brauchst, dann halt den WriteLine Ausdruck in ein sysvar.State () packen


Gruss, Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Bratmaxe
Beiträge: 1573
Registriert: 28.05.2015, 12:48
Wohnort: Willich
Hat sich bedankt: 4 Mal
Danksagung erhalten: 10 Mal

Re: Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von Bratmaxe » 19.02.2019, 13:41

Black hat geschrieben:
19.02.2019, 08:23
WriteLine ("Fertig : " # (localtime+Laufzeit).Format ("%H:%M:%S")); [/code]
Das man localtime so direkt abrufen kann war mir bisher nicht bekannt, danke für die Info!
Gruß Carsten

Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

Re: Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von Arthy » 19.02.2019, 14:52

Hallo Alchy,

vielen Dank fürs Sichten. Ich verstehe nur nicht warum das bei der Endzeit funktioniert und bei der Dauer nicht. Das ist wirklich die Ausgabe des Skripts. Wenn ich dich aber richtig verstehe, müsste ich statt .Variable() .Value() in der dritten Zeile ändern und dann würd es gehen?
Danke

Gruß
Arthy

alchy hat geschrieben:
19.02.2019, 07:18
sek in Zeile 2 ist im besten Fall der Name des Objektes aber nicht dessen Wert. Zeile 3 Gibt dann zwar den Wert aus
(ich würde auch .Variable() jedoch komplett verzichten und immer auf .Value() zum Lesen bz. .State() zum Schreiben von Werten greifen.)

Jedenfalls lässt sich mit einem String wie octoprint_printTime nicht rechnen. z:B. dann gleich in

Code: Alles auswählen

time Ende = now + sek.ToTime();
und es sollte auch ein ScriptRuntimeError im Fehlerprotokoll erzeugt werden.

Dein gepostetes Script darf eigentlich nur

Code: Alles auswählen

sek: 6595.000000
ausgeben. Habs aber nicht getestet.
Lösung ist also erstmal auf den Wert des Objektes zuzugreifen vor Wandlung in eine Zeit oder Rechnen.

Alchy

Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

Re: Umrechnung Sekunden in Minuten und Endzeitangabe

Beitrag von Arthy » 19.02.2019, 15:01

Hi Black,

das ist ja wirklich quick, schaue ich mir heut Abend auf jeden Fall auch an. Wie meinst du das mit den WriteLine Ausdruck in sysvar.State() packen? Sorry, muss echt noch einiges Lernen.

Besten Dank
Arthy
Black hat geschrieben:
19.02.2019, 08:23
auf die schnelle in Quick & dirty, kannst du ja anpassen nach Bedarf:

Code: Alles auswählen

real Laufzeit= 1200.0;
WriteLine ("Laufzeit: " # (Laufzeit.ToTime () -3600).Format ("%H:%M:%S"));
WriteLine ("Fertig  : " # (localtime+Laufzeit).Format ("%H:%M:%S")); 
Laufzeit muss du mit dem Inhalt des Wertes aus dem Drucker vorbesetzen.

Dann werfen dir diese beiden Zeilen Laufzeit formatiert und Endzeit aus.
Wen die in Sysvars brauchst, dann halt den WriteLine Ausdruck in ein sysvar.State () packen


Gruss, Black

Antworten

Zurück zu „HomeMatic allgemein“