Kommazahl in HH:MM

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
Hordeia
Beiträge: 20
Registriert: 01.11.2021, 15:29
System: CCU
Hat sich bedankt: 13 Mal

Kommazahl in HH:MM

Beitrag von Hordeia » 12.04.2022, 07:54

Entschuldigung für die Anfängerfrage, aber ich komme auch mit der Doku von EQ3 nicht viel weiter (neben dem Forum, Google usw.).
Der Doku fehlen für Anfänger wie mich einfache Beispiele :?

Ich will nur einfach eine Kommazahl in HH:MM wandeln.
Dazu habe ich leider keine Möglichkeit gefunden aus der Kommazahl die Zahl vor dem Komma und nach dem Komma zu trennen. Muss ich das tatsächlich über die Variable tun und den Punkt suchen und dann den linken und rechten Wert auslesen? Und wenn ja, wie macht man das? Ich finde nix zu links, rechts oder Punkt :(

Oder gibt es im Skripting hier schon eine Lösung, dass es über eine Klassifizierung gemacht werden kann?

Vermutlich stelle ich mich auch an, arbeite mit dem Kleinen Fenster in der HM Umgebung und das ist schon echt anstrengend. :roll:

Vielen Dank für alle konstruktiven Vorschläge!

jp112sdl
Beiträge: 12108
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2148 Mal
Kontaktdaten:

Re: Kommazahl in HH:MM

Beitrag von jp112sdl » 12.04.2022, 08:38

Schau dir mal in der Scriptdoku sowas wie Find(), Substr(), Split() an
https://www.eq-3.com/Downloads/eq3/down ... g_V2.2.pdf

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

MichaelN
Beiträge: 9655
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1617 Mal

Re: Kommazahl in HH:MM

Beitrag von MichaelN » 12.04.2022, 09:27

Und was nicht in der Script-Doku steht, findest Du im Link in meiner Signatur. Wenn Du wirklich rechts vom Komma Minuten stehen hast (und nicht Dezimal Minuten), dann kannst Du das, mit. Replace() gegen : austauschen und hast das richtige Format. Aber vermutlich hast Du Dezimal Werte.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Kommazahl in HH:MM

Beitrag von Tyfys » 12.04.2022, 13:08

Viele Wege führen nach ......

Mein Vorschlag wäre aufgedröselt /erklärt :

Code: Alles auswählen

!Ausgang Homatic-Zahl 
var kommazahl = 11.75;

!Zahl in Zeichenkette umsetzen mit 2 Nachkommastellen
kommazahl = kommazahl.ToString(2);

!Stunden vor Dezimalzeichen extrahieren
var std = kommazahl.StrValueByIndex(".", 0);
WriteLine(std);

!Minuten nach Dezimalzeichen extrahieren 
var min= kommazahl.StrValueByIndex(".", 1);
WriteLine(min);

!daraus wieder als Nachkommazahl machen damit führene Null z.B.  bei 0-9 Minuten erhaltenbleibt
min = ("0."#min).ToFloat() ;
WriteLine(min);

!in Minuten umrechnen 
min = min  * 0.60 ;
WriteLine(min);

!nun in Zeichenkette umwandeln und  Vorkommanull und Dezimalzeichen entfernen
min = min.ToString(2).Replace("0.","").Substr(0,2);
WriteLine(min);

!nun daraus den HH:MM string zusammensetzen  
!Stunden bei Bedarf mit führender Null
!if ( std.Length()<2) {std = "0" #std ;}
var hhmm= std #":" # min;
WriteLine(hhmm);
und in kompakter Form:

Code: Alles auswählen

var kommazahl = 09.25;
kommazahl = kommazahl.ToString(2);
var std = kommazahl.StrValueByIndex(".", 0);
var min = (("0."#kommazahl.StrValueByIndex(".", 1)).ToFloat() * 0.60).ToString(2).Replace("0.","").Substr(0,2);
if ( std.Length()<2) {std = "0" #std ;}
var hhmm= std #":" # min;
WriteLine(hhmm);
In der Script-Doku sind die verwendeten Befehle meist genau erklärt.
Gruß
Harry

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

Re: Kommazahl in HH:MM

Beitrag von alchy » 19.04.2022, 22:39

Hordeia hat geschrieben:
12.04.2022, 07:54
Ich will nur einfach eine Kommazahl in HH:MM wandeln.
...
Punkt suchen und dann den linken und rechten Wert auslesen?
geht natürlich auch, wie ja oben schon aufgeführt.

Dann könnte man noch mit schnöder Mathematik alles hin und her rechnen

Leider schreibst du nichts Genaueres.
Willst du wirklich die Angabe in Stunden und Minuten, auch wenn es sich z.B. um mehrerer Tage handelt?
hier gleich die ganze Rechnerei.

Code: Alles auswählen

var zeit = 9.5; ! Zeit hier in Stunden
!++++Finger weg +++++
integer imtimer = (zeit*60).ToInteger() ; !Timervorgabe in Minuten
integer istimer = imtimer*60; ! Timerzeit in Sekunden 
integer iTage = istimer / 86400; ! Timerzeit Tage 
integer iMinuten = (istimer % 3600) / 60; !Timerzeit Minuten
integer iStunden = (imtimer-iTage*1440) / 60;  ! Timerzeit Stunden
WriteLine((istimer/3600) #":" #iMinuten);
WriteLine(imtimer #" Minuten sind "#iTage #"Tag(e)  " #iStunden #" Stunden und " #iMinuten #" Minuten"); 
Oder sind es vielleicht immer unter einem Tag?.

In dem Fall die "kürzeste" Variante als mein Vorschlag:

Code: Alles auswählen

real zeit = 11.5; ! hier in Stunden 
string uhrzeit = ((zeit*3600)-3600).ToTime().Format("%H:%M");
oder natürlich noch weitere Varianten / Kombinationen


Tyfys hat geschrieben:
12.04.2022, 13:08
Viele Wege führen nach ......
Genau

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.

Hordeia
Beiträge: 20
Registriert: 01.11.2021, 15:29
System: CCU
Hat sich bedankt: 13 Mal

Re: Kommazahl in HH:MM

Beitrag von Hordeia » 06.06.2022, 08:24

Ich habe meine Aufgabe nun folgendermaßen gelöst:

Code: Alles auswählen

real c_tagesbeginn = 
  (system.SunriseTime("%M").ToFloat() / 60) + system.SunriseTime("%H").ToFloat();
WriteLine ("Sonnenaufgang Minuten als float: " # 
  system.SunriseTime("%M").ToFloat() / 60) + system.SunriseTime("%H").ToFloat();
WriteLine ("Sonnenaufgang ohne float: " # system.SunriseTime("%H") # ":" # 
  system.SunriseTime("%M"));
WriteLine ("c_tagesbeginn: " # c_tagesbeginn);
WriteLine (system.SunriseTime("%H:%M"));

var tb_stunde = c_tagesbeginn.ToInteger();
WriteLine (tb_stunde);
var tb_minute = ((c_tagesbeginn - c_tagesbeginn.ToInteger()) * 60).ToInteger();
WriteLine (tb_minute);

WriteLine(c_tagesbeginn.ToInteger() # ":" # 
  ((c_tagesbeginn - c_tagesbeginn.ToInteger()) * 60).ToInteger());

Damit sehe ich den Wert meiner Homematic für den Sonnenaufgang als Float-Wert mit Stunden und Minuten getrennt.
Und umgekehrt kann ich den umgekehrten Wert rechnen.

Vielleicht hilft es an der ein oder anderen Stelle.

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“