FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: jostmario am 04 Juli 2019, 22:56:43

Titel: Etwas nur bis 23:50 ausführen
Beitrag von: jostmario am 04 Juli 2019, 22:56:43
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
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: roedert am 04 Juli 2019, 23:35:30
Warum nicht einfach ein at mit disableforinterval?
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: jostmario am 04 Juli 2019, 23:44:51
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
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: MadMax-FHEM am 05 Juli 2019, 00:01:59
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
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag 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
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: Damian am 05 Juli 2019, 10:00:51
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 ...)
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: Otto123 am 05 Juli 2019, 11:07:48
Als Ergänzung
Er wollte 5 sec und nicht 5 min :) -> +00:00:05
und do always braucht er auch noch.

Gruß Otto
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: Damian am 05 Juli 2019, 13:45:58
Einen habe ich noch :)

DOIF {[00:05-23:55,+5]; myperlroutine ()}

Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: jostmario am 05 Juli 2019, 21:09:41
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

Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: roedert am 06 Juli 2019, 11:34:31
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.
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: jostmario am 06 Juli 2019, 14:13:12
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
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: roedert am 07 Juli 2019, 16:10:30
Event-Min-Interval ..... tut auch generell der Performance gut
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: jostmario am 07 Juli 2019, 21:34:51
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
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: Meck am 08 Juli 2019, 08:25:19
Hallo Jostmario,

hast du schon mal versucht, dass über die Kommandofeld zu lösen?

https://wiki.fhem.de/wiki/Event-min-interval

Gruß
Meck
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: jostmario am 09 Juli 2019, 10:42:05
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
Titel: Antw:Etwas nur bis 23:50 ausführen
Beitrag von: krikan am 09 Juli 2019, 11:09:18
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