Morgen,
ich wende mich mal heute an Euch...Stehe auf dem Schlauch.
Mein Landroid liefert mir die täglichen Mähzeiten als Readings
cfg_sc_d_1_1 08:00
cfg_sc_d_1_2 480
cfg_sc_d_1_3 1
soll bedeuten cfg_d_(1-7 Sonntag-Sonnabend)_(1=Startzeit 8:00, 2=Dauer in Minuten, 3=0 oder 1 Rand mähen)
Ich möchte jetzt im Tablet UI die Daten ausgeben. In der Form:
Startzeit Endzeit Rand mähen.
Zur Berechnung der Endzeit hab ich keine Idee. Hab schon probiert mit drehe mich aber irgendwie im Kreis,
Montag {str2time(ReadingsNum($name,'2000-01-01 '."cfg_sc_d_2_1".':00',0))+ int(ReadingsNum($name,"cfg_sc_d_2_1",0))*60}
Meine Reading ergibt
Montag 1629312000
Im TabletUI habe ich folgendes
<div data-type="label"
data-device="Mr.Cutty"
data-get="Montag"
data-substitution="toDate().hhmmss()"
class="">
</div>
Angezeigt wird mir 18:40:00
Kann mir jemand helfen?
Danke
Hi,
Im Wiki gibt es einen Artikel: rechnen mit Zeitangaben- oder so ähnlich.
Such mal danach, dort steht eigentlich alles.
Gruß Otto
Zitat von: Otto123 am 19 August 2021, 23:30:01
Hi,
Im Wiki gibt es einen Artikel: rechnen mit Zeitangaben- oder so ähnlich.
Such mal danach, dort steht eigentlich alles.
Gruß Otto
Vermutlich das hier: https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit
Gruß, Joachim
Danke für den Hinweis, da war ich schon.
Wie gesagt irgendwie stehe ich auf dem Schlauch ::)
Ich habe also die Startzeit 08:00 als String und die Dauer 480 als String
Um die Endzeit zu bekommen muss ich quasi Startzeit + Dauer rechnen.
Soweit so gut.
Meine Idee aus der Startzeit -> Sekunden
time_str2num(ReadingsNum($name,'2000-01-01 '."cfg_sc_d_2_1".':00',0))
dann die Dauer in Sekunden umrechnen und hinzufügen
int(ReadingsNum($name,"cfg_sc_d_2_1",0))*60
dann habe ich die Zeit in Sekunden
FmtTime(ReadingsNum($name,"a","0"))
sollte das zeigen, Ergebnis aber 10:55:57
Wo ist mein Gedankenfehler? :o
Zitat
time_str2num(ReadingsNum($name,'2000-01-01 '."cfg_sc_d_2_1".':00',0))
Äh was hattest du hier gedacht?
ReadingsNum geht so: ReadingsNum("DeviceName", "ReadingName", Ersatzwert)
-> $name musst du schauen, ob es das gibt, bei/als userreadings ja (aber nicht generell)
-> dein ReadingName: '2000-01-01 '."cfg_sc_d_2_1".':00' -> 2000-01-01cfg_sc_d_2_1:00 -> den gibt es doch gar nicht? ;)
-> auch hast du immer sc_d_2_1 oben in deinem Beispiel gibt es nur cfg_sc_d_1_1, cfg_sc_d_1_2, cfg_sc_d_1_3
Eher: time_str2num("2021-08-20" . ReadingsNum($name,"cfg_sc_d_1_1",0) . ":00") wobei ich nicht weiß, ob man das hier "so" machen kann, also ReadingsNum in die Perl-Funktion "einbauen". Evtl. vorher einer Variablen zuweisen...
Außerdem gilt das ja immer nur für einen Tag ;)
Gut wenn einen dann nur Unterschied und Uhrzeit usw. "interessiert" isses auch wieder "egal"... ;)
int(ReadingsNum($name,"cfg_sc_d_2_1",0))*60 -> wie oben schon geschrieben: in deinem Beispiel gibt es nur cfg_sc_d_1_1, cfg_sc_d_1_2, cfg_sc_d_1_3
Aber die Startzeit ist doch immer nur Stunde:Minute oder?
Warum nicht das einfach auslesen:
ReadingsVal($name, "cfg_sc_d_1_1", "00:00");
das dann mittels split in HH und MM "trennen":
my @StartTime=split(/:/, ReadingsVal($name, "cfg_sc_d_1_1", "00:00"));
in $StartTime[0] -> Stunden
in $StartTime[1] -> Minuten
Und dann einfach die Laufzeit (in Minuten?) schauen wieviele Stunden -> das zu $StartTime[0] dazu und wieviele Minuten (Rest) dann zu $StartTime[1]
Das dann zu einem "Uhrzeit-String": $Ende = $StartTime[0] . ":" . $StartTime[1]
(sofern die Laufzeiten gleich auf die Werte $StartTime[0] bzw. $StartTime[1] "addiert" wurden ansonsten halt da wo die EndzeitStunden-/EndzeitMinuten-Werte stehen)
Gruß, Joachim
Zitat von: MadMax-FHEM am 20 August 2021, 14:58:45
Äh was hattest du hier gedacht?
damit wollte ich einen Zeitwert im Sinne von 2000-01-01 08:00:00 erreichen.
Zitat-> auch hast du immer sc_d_2_1 oben in deinem Beispiel gibt es nur cfg_sc_d_1_1, cfg_sc_d_1_2, cfg_sc_d_1_3
doch die 2 Bedeutet Montag.
Danke für Deinen Tipp. Werde ich zeitnah testen. Feedback folgt, schönes Wochenende
Zitat von: BAfH am 20 August 2021, 12:33:57
Ich habe also die Startzeit 08:00 als String und die Dauer 480 als String
Um die Endzeit zu bekommen muss ich quasi Startzeit + Dauer rechnen.
{my ($h,$m) = split(":","08:00");; my $t1=$h*3600+$m*60;; $t1+=480*60;; sprintf("%02d:%02d:%02d", $t1/3600, ($t1/60)%60, $t1%60)}
ergibt im Beispiel korrekt 16:00:00
Nun musst Du nur noch die absoluten Werte "08:00" und 480 durch entsprechende ReadingsVal() und ReadingsNum() ersetzen.
Aber das schaffst Du sicher alleine.
Ich wüsste gerne was genau %60 macht, warum wird aus 960%60 (0)0 und aus 57600%60 (0)0 ?
Was ich mir bisher zusammengesucht erhellt mich nicht ::)
Kann mir jemand eine Quelle nennen die mir weiterhilft oder kurz erklären was es macht ?
% ist der Modulo operator und liefert den Rest der Division - siehe https://de.wikipedia.org/wiki/Division_mit_Rest
960 : 60 list exakt 16 ohne Rest
57600 : 60 ist exakt 960 - auch ohne Rest
Danke an Betateilchen, Dein Hinweis ist es gewesen. Danke ;)
Ich habe jetzt mal mein UserReading für meinen Worx Landroid angepasst, am Ende sind jetzt die Endzeiten für die einzelnen Tag userReadings mowerActive:mowerActiveIndex.* {ReadingsVal($name,"mowerActiveIndex","0") ? "true" : "false"},\
mowerStatusTxt:mowerStatusIndex.* {my %stateCodes = (\
0 => "Leerlauf",\
1 => "Garage",\
2 => "Start Sequenz",\
3 => "Start von Home",\
4 => "folgt dem Kabel",\
5 => "Sucht Garage",\
6 => "Sucht Kabel",\
7 => "Mäht",\
8 => "hochgehoben !",\
9 => "festgefahren !",\
10 => "Messer blockiert",\
11 => "Debug",\
12 => "Remote control",\
30 => "in die Garage",\
31 => "Zone Training",\
32 => "Rand schneiden",\
33 => "Such Zone",\
34 => "Pause"\
);; $stateCodes{ReadingsVal($name,"mowerStatusIndex","0")}},\
mowerErrorTxt:mowerErrorIndex.* { my %errorCodes = (\
0 => "",\
1 => "festgefahren",\
2 => "hochgehoben",\
3 => "kein Kabel",\
4 => "außerhalb Kabel",\
5 => "Regen",\
6 => "Close door to mow",\
7 => "Close door to go home",\
8 => "Messer Motor blockiert",\
9 => "Rad Motor blockiert",\
10 => "festgefahren timeout",\
11 => "Upside down",\
12 => "Battery low",\
13 => "Reverse wire",\
14 => "Charge error",\
15 => "Timeout finding home",\
16 => "Mower locked",\
17 => "Battery temp out of range"\
);; $errorCodes{ReadingsVal($name,"mowerErrorIndex","0")}},\
mowerbatteryChargingTxt:batteryCharging.* {my %batteryCodes = (\
0 => "Nein",\
1 => "Akku laden",\
);; $batteryCodes{ReadingsVal($name,"batteryCharging","0")}},\
Arbeitszeit {int(ReadingsNum($name,"totalTime",0)/60 )." h"},\
Klingenzeit {int(ReadingsNum($name,"bladeTimeCounter",0)/60 )." h"},\
Entfernung {int(ReadingsNum($name,"totalDistance",0)/1000)." km"},\
Montag {my ($h,$m) = split(":",ReadingsVal("Mr.Cutty","cfg_sc_d_2_1",0));;;; my $t1=$h*3600+$m*60;;;; $t1+=ReadingsVal("Mr.Cutty","cfg_sc_d_2_2",0)*60;;;; sprintf("%02d:%02d", $t1/3600, ($t1/60)%60, $t1%60)},\
Dienstag {my ($h,$m) = split(":",ReadingsVal("Mr.Cutty","cfg_sc_d_3_1",0));;;; my $t1=$h*3600+$m*60;;;; $t1+=ReadingsVal("Mr.Cutty","cfg_sc_d_3_2",0)*60;;;; sprintf("%02d:%02d", $t1/3600, ($t1/60)%60, $t1%60)},\
Mittwoch {my ($h,$m) = split(":",ReadingsVal("Mr.Cutty","cfg_sc_d_4_1",0));;;; my $t1=$h*3600+$m*60;;;; $t1+=ReadingsVal("Mr.Cutty","cfg_sc_d_4_2",0)*60;;;; sprintf("%02d:%02d", $t1/3600, ($t1/60)%60, $t1%60)},\
Donnerstag {my ($h,$m) = split(":",ReadingsVal("Mr.Cutty","cfg_sc_d_5_1",0));;;; my $t1=$h*3600+$m*60;;;; $t1+=ReadingsVal("Mr.Cutty","cfg_sc_d_5_2",0)*60;;;; sprintf("%02d:%02d", $t1/3600, ($t1/60)%60, $t1%60)},\
Freitag {my ($h,$m) = split(":",ReadingsVal("Mr.Cutty","cfg_sc_d_6_1",0));;;; my $t1=$h*3600+$m*60;;;; $t1+=ReadingsVal("Mr.Cutty","cfg_sc_d_6_2",0)*60;;;; sprintf("%02d:%02d", $t1/3600, ($t1/60)%60, $t1%60)},\
Sonnabend {my ($h,$m) = split(":",ReadingsVal("Mr.Cutty","cfg_sc_d_7_1",0));;;; my $t1=$h*3600+$m*60;;;; $t1+=ReadingsVal("Mr.Cutty","cfg_sc_d_7_2",0)*60;;;; sprintf("%02d:%02d", $t1/3600, ($t1/60)%60, $t1%60)},\
Sonntag {my ($h,$m) = split(":",ReadingsVal("Mr.Cutty","cfg_sc_d_1_1",0));;;; my $t1=$h*3600+$m*60;;;; $t1+=ReadingsVal("Mr.Cutty","cfg_sc_d_1_2",0)*60;;;; sprintf("%02d:%02d", $t1/3600, ($t1/60)%60, $t1%60)},\
Fehler { return "true" if (ReadingsVal($name,"mowerErrorIndex","0"))> 0 ;; return "false" }