Etwas nur bis 23:50 ausführen

Begonnen von jostmario, 04 Juli 2019, 22:56:43

Vorheriges Thema - Nächstes Thema

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

roedert

Warum nicht einfach ein at mit disableforinterval?

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

OliS.

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
PVE auf MiniPC (N100) mit FHEM, Zigbee2MQTT, Homebridge, DeConz

Damian

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

Otto123

Als Ergänzung
Er wollte 5 sec und nicht 5 min :) -> +00:00:05
und do always braucht er auch noch.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Einen habe ich noch :)

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

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

jostmario

#8
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

Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

roedert

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.

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

roedert

Event-Min-Interval ..... tut auch generell der Performance gut

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

Meck

Hallo Jostmario,

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

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

Gruß
Meck

jostmario

#14
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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611