Mahlzeit!
Ich versuche in einem DOIF im Perl Mode ein paar Zeitberechnungen zu machen. Ich einem Reading wateringtime des DOIF steht die Bewässerungszeit im Format HH:MM, in einem weiterem Reading die Bewässerungsdauer in Minuten. Ich will ein weiteres Reading im DOIF bereitstellen und dieses aus Zeitpunkt + Dauer berechnen. Da mir nichts besseres eingefallen ist, wollte ich die Stunden und Minuten am Doppelpunkt aufteilen, die Stunden in Minuten umrechnen, die Minuten dazu addieren, dito die Dauer. Und dann wieder zurück in das Format HH:MM und das neue Reading schreiben.
Ich scheitere allerdings schon an split:
##
## Änderung eigene Readings
##
{ if (["^$SELF$:^wateringduration:.*$"]) {
my $wateringtime = ReadingsVal("$SELF","wateringtime",0); ## Bewässerungszeitpunkt
my $duration = ReadingsVal("$SELF","wateringduration",0); ## Bewässerungsdauer
my @splittime = split /:/, "$wateringtime"); ## am ':' teilen
## $SELF_DebugMessage("@splittime[0] @splittime[1]"); ## Debug
## $SELF_DebugMessage("$wateringtime $duration"); ## Debug
}
}
So bekomme ich ein 'condition c07: syntax error,"' beim Triggern, ohne die beiden "" wird das auch nicht besser:
##
## Änderung eigene Readings
##
{ if (["^$SELF$:^wateringduration:.*$"]) {
my $wateringtime = ReadingsVal("$SELF","wateringtime",0); ## Bewässerungszeitpunkt
my $duration = ReadingsVal("$SELF","wateringduration",0); ## Bewässerungsdauer
my @splittime = split /:/, $wateringtime); ## am ':' teilen
## $SELF_DebugMessage("@splittime[0] @splittime[1]"); ## Debug
## $SELF_DebugMessage("$wateringtime $duration"); ## Debug
}
}
Wie greife ich dann auf die Elemente des Arrays zu; mit @splittime[0] oder $splittime[0]? Das zu versuchen, so weit komme ich aktuell gar nicht, irgenmdwie klemmt gerade die Säge beim split...
Oder kennt jemand einen einfacheren Weg ohne split?
Danke Peter
Du kannst die Daten ins (interne) Unixformat konvertieren, dort problemlos addieren und zurück verwandeln.
Alternativ kannst du auch nur die Startzeit nutzen und die Dauer im wait oder on-for-time. Dann musst du gar nicht rechnen.
Hi Per,
OK, womit wandle ich das um? Genau das hatte ich gestern versucht mit diversen Zeitfunktionen, bin nicht weiter gekommen...
On-for-timer ist klar, nutze ich. Das Ende als Reading benötige ich jeweils für das nachgelagerte Ventil, um da dynamisch die Startzeit zu berechnen. Die ist aktuell noch fix von mir eingetragen, ich will das aber flexibel haben und für die ganze Bewässerungskette (sind 8 Kreise) nur einmal die Startzeit angeben.
Aber das ist dann der nächste Schritt...
Fazit: ein Hinweis zur Konvertierung in das Zeitformat wäre schön, sprich wie heißt die Funktion?
Gruß Peter
[EDIT]
Eine Klammer hatte gefehlt... Tomaten auf den Augen, wie immer. :-[
##
## Änderung eigene Readings
##
{ if (["^$SELF$:^wateringduration:.*$"]) {
my $wateringtime = ReadingsVal("$SELF","wateringtime",0); ## Bewässerungszeitpunkt
my $duration = ReadingsVal("$SELF","wateringduration",0); ## Bewässerungsdauer
my @splittime = split(/:/, $wateringtime); ## am ':' teilen
$SELF_DebugMessage("$splittime[0] $splittime[1]"); ## Debug
## $SELF_DebugMessage("$wateringtime $duration"); ## Debug
}
}
Ich verfolge jetzt den Weg weiter, die Funktion zum Konvertieren von HH:MM ins Unix Zeitformat interessiert mich trotzdem.
Danke Peter
Wenn du das berechnete Zeitreading wieder als Zeittrigger nutzen willst, dann kannst du die Berechnung des Zeitpunkts DOIF überlassen - es kann mit Zeiten rechnen.
{
[([$SELF:wateringtime]+[$SELF:wateringduration])]; ## neuer Triggerzeitpunkt
....
}
Zitat von: Damian am 11 Juni 2023, 16:33:19Wenn du das berechnete Zeitreading wieder als Zeittrigger nutzen willst, dann kannst du die Berechnung des Zeitpunkts DOIF überlassen - es kann mit Zeiten rechnen.
{
[([$SELF:wateringtime]+[$SELF:wateringduration])]; ## neuer Triggerzeitpunkt
....
}
das klingt gut; schön zu wissen!
Peter