Hauptmenü

DOIF und Zeitberechnung

Begonnen von PSI69, 11 Juni 2023, 12:22:21

Vorheriges Thema - Nächstes Thema

PSI69

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
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Per

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.

PSI69

#2
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
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Damian

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
  ....
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PSI69

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
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...