FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: gestein am 16 Februar 2022, 23:57:40

Titel: [gelöst] Relative Zeitangabe an Raster ausrichten?
Beitrag von: gestein am 16 Februar 2022, 23:57:40
Hallo,

Man kann in DOIF einfach relative Zeitangaben als Trigger verwenden z.B. [+:15] um etwas alle 15min zu tun.

Aber wie kann man das um z.B. 1min verschieben?
Die Funktion sollte also um 01, 16, 31, 46 getriggert werden.

Geht das auch?

Danke im Voraus
Lg, Gerhard
Titel: Antw:Relative Zeitangabe an Raster ausrichten?
Beitrag von: Damian am 17 Februar 2022, 08:20:44
ja, du kannst mit Zeitangaben im DOIF rechnen: https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung

daher:

[([+:15]+[00:01])]
Titel: Antw:Relative Zeitangabe an Raster ausrichten?
Beitrag von: gestein am 17 Februar 2022, 08:36:30
Mal wieder ums Eck gedacht.
Ist aber irgendwie logisch.
Vielen Dank für die Lösung!

Lg, Gerhard
Titel: Antw:[gelöst] Relative Zeitangabe an Raster ausrichten?
Beitrag von: gestein am 17 Februar 2022, 11:38:42
Hallo,

habe das nun in mein DOIF eingebaut.
sub CalculateQuarterSums { [([+:15]+[00:01])];
set_Reading("last_quarter_sum",[?#sum:"^$SELF$":"last_quarter$"]);
}
sub CalculateHourSums { [([+:00]+[00:01])];
set_Reading("last_hour_sum",[?#sum:"^$SELF$":"last_hour$"]);
}


Aber es scheint nicht ganz zu funktionieren.
Der Trigger für z.B. wird nur einmal pro Stunde um x:16 ausgeführt, aber nicht um x:31, x:46 und scheinbar auch nicht um x:01.
Verliert DOIF irgendwie das "+"?

Bei der Variante zur vollen Stunde weiß ich es noch nicht.
Wahrscheinlich erst um Mitternacht, aberr ich habe das erst seit heute Früh am Laufen.

lg, Gerhard
Titel: Antw:[gelöst] Relative Zeitangabe an Raster ausrichten?
Beitrag von: Damian am 17 Februar 2022, 11:54:02
Trigger funktionieren nur in DOIF-Blöcken, das Wort sub ist hier zu viel. So dürften bei dir gar keine Timer gesetzt worden sein.
Titel: Antw:[gelöst] Relative Zeitangabe an Raster ausrichten?
Beitrag von: gestein am 17 Februar 2022, 12:23:12
Ich habe versucht, das in meinem DOIF einzubauen.
Aber es klappt nicht.
Anscheinend werden die Timer gesetzt, die Funktion wird aber nicht getriggert bzw. aufgerufen.

DEF TPL_stat (midnight_$1_$2 { [00:00:05];
  set_Reading("$1_$2_counter",[?$1:$2]);
  set_Reading("$1_$2_last_day",get_Reading("$1_$2_day",0),1);
  set_Reading("$1_$2_day",0,1);
  set_Reading("$1_$2_month",get_Reading("$1_$2_month",0)+get_Reading("$1_$2_last_day",0),1);
  if ($mday == 1) {
    set_Reading("$1_$2_last_month",get_Reading("$1_$2_month",0),1);
    set_Reading("$1_$2_month",0,1);
    set_Reading("$1_$2_year",get_Reading("$1_$2_year",0)+get_Reading("$1_$2_last_month",0),1);
  }
  if ($yday == 1) {
    set_Reading("$1_$2_last_year",get_Reading("$1_$2_year",0),1);
    set_Reading("$1_$2_year",0,1);
  }
}

hour_$1_$2 { [:00];
  set_Reading("$1_$2_hour_counter",[?$1:$2]);
  set_Reading("$1_$2_last_hour",get_Reading("$1_$2_hour",0),1);
  set_Reading("$1_$2_hour",0);
}

quarter_$1_$2 { [+:15];
  set_Reading("$1_$2_quarter_counter",[?$1:$2]);
  set_Reading("$1_$2_last_quarter",get_Reading("$1_$2_quarter",0),1);
  set_Reading("$1_$2_quarter",0);
}

update_counters_$1_$2 {
##  Log 1, "update_counters_$1_$2: [?$1:$2];".get_Reading("$1_$2_counter",0).";".get_Reading("$1_$2_hour_counter",0).";".get_Reading("$1_$2_quarter_counter",0);
  set_Reading("$1_$2_day",int(([$1:$2,0]-get_Reading("$1_$2_counter",0))*1000)/1000,1);
  set_Reading("$1_$2_hour",int(([$1:$2,0]-get_Reading("$1_$2_hour_counter",0))),1);
  set_Reading("$1_$2_quarter",int(([$1:$2,0]-get_Reading("$1_$2_quarter_counter",0))),1);
}

init_$1_$2 {
  if (!get_Reading("$1_$2_counter","")) {
    set_Reading("$1_$2_quarter_counter",[?$1:$2]);
set_Reading("$1_$2_hour_counter",[?$1:$2]);
    set_Reading("$1_$2_counter",[?$1:$2]);
set_Reading ("$1_$2_quarter",0);
set_Reading ("$1_$2_hour",0);
    set_Reading ("$1_$2_day",0);
    set_Reading ("$1_$2_month",0);
    set_Reading ("$1_$2_year",0);
set_Reading ("$1_$2_last_quarter",0);
set_Reading ("$1_$2_last_hour",0);
set_Reading ("$1_$2_last_day",0);
    set_Reading ("$1_$2_last_month",0);
    set_Reading ("$1_$2_last_year",0);
set_Reading ("sum_last_quarter",0);
set_Reading ("sum_last_hour",0);
set_Reading ("sum_last_day",0);
  }
}
)
##https://forum.fhem.de/index.php/topic,84969.msg1208710.html#msg1208710
CalculateQuarterSums { [([+:15]+[00:01])];
set_Reading("last_quarter_sum",[?#sum:"^$SELF$":"last_quarter$"]);
}
CalculateHourSums { [([+:00]+[00:01])];
set_Reading("last_hour_sum",[?#sum:"^$SELF$":"last_hour$"]);
}

FOR(::devspec2array("MQTT2_shelly.*:FILTER=group=Haushaltsgeräte"), TPL_stat ($_,energy_total))


Die Timer werden anscheinend richtig gesetzt (zumindest gibt es readings "timer_x_cy" mit den richtigen Werten.
lg, Gehard
Titel: Antw:[gelöst] Relative Zeitangabe an Raster ausrichten?
Beitrag von: gestein am 17 Februar 2022, 12:58:27
Ich sehe gerade, dass im folgenden Reading des DOIF steht, dass die Funktion "CalculateQuarterSums" zur korrekten Zeit aufgerufen wurde:
block_CalculateQuarterSums executed 2022-02-17 12:46:00
Eigentlich eh sehr informativ, wenn man die Zusammenhänge versteht  ;)

Dann funktioniert es, aber die Summenbildung klappt so (noch) nicht.

Und "CalculateHourSums" wird nicht aufgerufen.
Es gibt auch kein "block_CalculateHourSums"-reading.

lg, Gerhard

Titel: Antw:[gelöst] Relative Zeitangabe an Raster ausrichten?
Beitrag von: Damian am 17 Februar 2022, 14:25:03
Beim mir funktioniert alles mit deinem Code:

Du hast nur die falschen Readings initialisiert:

Es muss heißen:

set_Reading ("last_quarter_sum",0);
set_Reading ("last_hour_sum",0);
set_Reading ("last_day_sum",0);
Titel: Antw:[gelöst] Relative Zeitangabe an Raster ausrichten?
Beitrag von: gestein am 17 Februar 2022, 16:08:24
Eigenartig.
Bei mir klappt das mit der vollen Stunde nicht.
Das "[([+:00]+[00:01])]" kann doch nicht stimmen.

Wäre es nicht besser [:01] zu schreiben?

lg, Gerhard
Titel: Antw:[gelöst] Relative Zeitangabe an Raster ausrichten?
Beitrag von: Damian am 17 Februar 2022, 16:36:13
Meine Aussage bezog sich vielmehr auf die Berechnung der Summen:

ZitatDann funktioniert es, aber die Summenbildung klappt so (noch) nicht.

Und "CalculateHourSums" wird nicht aufgerufen.
Es gibt auch kein "block_CalculateHourSums"-reading.

Für volle Stunde musst du [:00] angeben.