Hallo,
rufe hier ein script alle 5 secunden auf.
sub berechnestrom
{
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
Log 5, "zeitsec $sec";
Log 5, "zeitmin $min";
Log 5, "zeitstd $hour";
if ( $hour < 23 )
{
fhem("setreading stromzaehler Kosten $tagesverbrauchgerechnet");
}
}
in der sub steht noch etwas mehr drin zur übersichtlichkeit hab ich es gekürzt.
so wie es jetzt da steht führt er es nur bis 23:00 aus es soll aber bis 23:55 ausgeführt werden.
Dann pausieren und um 00:05 wieder starten.
Jemand eine idee ?
Gruß Josty
Warum nicht einfach ein at mit disableforinterval?
Hallo,
weil die sub ja noch mehr macht.
hab es jetzt mal so versucht:
if ((( $hour == 23 ) && ( $min > 55 )) or (( $hour == 0 ) && ($min < 5 )))
{
}
else
{
fhem("setreading stromzaehler Kosten $tagesverbrauchgerechnet");
}
mal sehen ob es funktioniert.
Gruß Josty
Du kannst bei einem at doch auch eine Sub aufrufen...
Also das at ist so eingestellt, dass es alle 5sec auslöst (warum auch immer alle 5sec) außer zwischen 23:55 und 00:05 (disabledForIntervals) und du machst einfach in der aufgerufenen Sub was immer du alle 5sec machen willst mit Ausnahme zwischen 23:55 und 00:05 weil da das at gar nicht auslöst...
Gruß, Joachim
Ohne jetzt hier groß Werbung machen zu wollen, aber sowas ließe sich doch recht einfach mit einem einzigen DOIF lösen.
([00:05-23:55] and [+00:05])
(Ausführung)
Oli
Zitat von: OliS. am 05 Juli 2019, 09:51:14
Ohne jetzt hier groß Werbung machen zu wollen, aber sowas ließe sich doch recht einfach mit einem einzigen DOIF lösen.
([00:05-23:55] and [+00:05])
(Ausführung)
Oli
Oder man nutzt gleich Intervall-Timer:
DOIF ([00:05-23:55,+:05]) (set ...)
Als Ergänzung
Er wollte 5 sec und nicht 5 min :) -> +00:00:05
und do always braucht er auch noch.
Gruß Otto
Einen habe ich noch :)
DOIF {[00:05-23:55,+5]; myperlroutine ()}
Hallo,
ja dank euch das doif sieht ja einfach aus muss ich mal schauen ob ich die sub ändern kann so das ich das doif verwenden kann.
momentan funktioniert es anscheinend direkt in der 99_myutils.pm so:
if ((( $hour == 23 ) && ( $min > 55 )) or (( $hour == 0 ) && ($min < 5 )))
{
}
else
{
fhem("setreading stromzaehler Kosten $tagesverbrauchgerechnet");
}
die gesammte sub sieht ja so aus:
sub berechnestrom
{
my $alterwert = ReadingsVal("stromzaehler","wechselrichter","0");
my $verbrauch = ReadingsVal("CM160","W","0");
my $wechselrichter = ReadingsVal("MQTT2_DVES_32B440","ENERGY_Power","0");
my $stromverbrauch = $verbrauch - $wechselrichter;
Log 4, "berechnestrom $verbrauch Watt minus Wechselrichter $wechselrichter";
# fhem("setreading CM160 Wattt $stromverbrauch");
fhem("setreading CM160 Wattgerechnet $stromverbrauch");
# fhem("setreading stromzaehler Wattt $stromverbrauch");
fhem("setreading stromzaehler Wattgerechnet $stromverbrauch");
if ($wechselrichter > $alterwert)
{
fhem("set myMPD volume 30; set myMPD play 9");
}
if ($wechselrichter > $alterwert)
{
fhem("setreading stromzaehler wechselrichtermax $wechselrichter");
fhem("setreading stromzaehler wechselrichter $wechselrichter");
}
my $hour = (localtime)[2];
Log 5, "zeit $hour";
if ( $hour >= 23 or $hour < 6 )
{
fhem("setreading stromzaehler wechselrichtermax 0");
fhem("setreading stromzaehler wechselrichter 0");
}
my $tageskwh = ReadingsVal("stromzaehler","energie_tag","0");
my $tageskwhWR = ReadingsVal("MQTT2_DVES_32B440","ENERGY_Today","0");
my $tagesverbrauchgerechnet = $tageskwh - $tageskwhWR;
$tagesverbrauchgerechnet = sprintf("%.2f",$tagesverbrauchgerechnet * 0.2507);
# my $hour = (localtime)[2];
# my $hourmin = (localtime)[3];
# my $hourmix = (localtime);
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
Log 5, "zeitsec $sec";
Log 5, "zeitmin $min";
Log 5, "zeitstd $hour";
# if ( $hour < 23 )
# {
# fhem("setreading stromzaehler Kosten $tagesverbrauchgerechnet");
# }
if ((( $hour == 23 ) && ( $min > 55 )) or (( $hour == 0 ) && ($min < 5 )))
{
}
else
{
fhem("setreading stromzaehler Kosten $tagesverbrauchgerechnet");
}
}
Gruß Josty
Nur davon dass etwas in der myUtils steht, wird es ja noch nicht ausgeführt - auch da musst du ja noch ein at für haben.
Und grundsätzlich solltest du überlegen, ob ,,alle 5 Sekunden" überhaupt sinnvoll ist. FHEM funktioniert eventbasiert, das heisst deine Berechnungsroutine sollte über Events gestartet werden wenn sich einer der Eingabewerte ändert.
Hallo,
ja theoretisch müsste ich das EVENT vom Strommesser OWL nehmen da kommen aber ca. alle 1-2 sec werte an.
Deshalb habe ich es auf 5 sec mit einem at gesetzt.
Gruß Josty
Event-Min-Interval ..... tut auch generell der Performance gut
Hallo,
ja würde ich ja gerne setzen aber das Modul CM160 gibt das nicht her.
kann man das irgendwie hinzufügen ?
Anbei ein bild mit den verfügbaren attributen.
Gruß Josty
Hallo Jostmario,
hast du schon mal versucht, dass über die Kommandofeld zu lösen?
https://wiki.fhem.de/wiki/Event-min-interval
Gruß
Meck
Hallo,
ja das nimmt er dann nicht gibt eine fehlermeldung dann.
habe jetzt im Modul . $readingFnAttributes hinzugefügt.
jatzt bietet er mir event-on-change-reading an.
sub CM160_Initialize($) {
my ($hash) = @_;
require $attr{global}{modpath} . '/FHEM/DevIo.pm';
$hash->{ReadFn} = 'CM160_read';
$hash->{ReadyFn} = 'CM160_ready';
$hash->{DefFn} = 'CM160_define';
$hash->{UndefFn} = 'CM160_undef';
$hash->{AttrList} = 'do_not_notify:0,1 dummy:1,0 showtime:1,0 debugpwr:0,1 loglevel:0,1,2,3,4,5,6 '.
'ignore:0,1 model:CM160 costPerKwh currency voltage co2Factor'. $readingFnAttributes;;
}
und habe es jetzt von einem at alle 5 sec auf ein notify umgestellt.
Denke das ganze CM160 Modul sollte mal überarbeitet werden aber dafür reicht mein kenntnisstand nicht.
Wenn jemand Lußt hat das Modul zu überarbeiten und evtl sogar in Fhem einzuchecken hat kann er sich ja bei mir melden.
Gruß Josty
Zitat von: jostmario am 09 Juli 2019, 10:42:05
habe jetzt im Modul . $readingFnAttributes hinzugefügt.
jatzt bietet er mir event-on-change-reading an.
Kenne das Modul nicht, darum nur als Hinweis:
Das einfache Ergänzen und Anbieten der event.*-Attribute bedeutet nicht, dass die Attribute die gewünschte Wirkung haben. Schlimmstenfalls sind sie funktionslos.
Mehr dazu bspw. in https://wiki.fhem.de/wiki/DevelopmentModuleIntro#X_Initialize
Gruß, Christian