FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: didi-fritz am 29 März 2016, 23:06:08

Titel: Frage zu event-on-change-reading für STATE
Beitrag von: didi-fritz am 29 März 2016, 23:06:08
Hallo,

ich (über)steuere meine Heizung mit einem AT-Job, der alle 10 Minuten einige FHEM-Objekte (Anwesenheit, Feiertag, Wetterbericht, ..) abfragt und dann mit "set HeizungExtAnforderung on-for-timer 630" bzw. "set HeizungExtSperren on-for-timer 630" die Eingänge meines Viessmann-Kessels für 10 Min. 30 Sec. schaltet.
Für diese Variante mit den on-timer hab ich mich entschieden, weil die Kommandos zyklisch wiederholt werden und falls FHEM einmal nicht läuft, der Kessel von selbst wieder in sein Normal-Programm zurückgeht.

Jetzt hab ich nur das Problem, dass ich z.B. alle 10 Minuten in meinem FileLog "HeizungExtSperren on" finde, obwohl der Status bereits auf "on" ist.

Alle Versuche wie "attr  HeizungExtSperren event-on-change-reading .*", "attr  HeizungExtSperren event-on-change-reading state" oder "attr  HeizungExtSperren event-on-change-reading STATE" bringen keinen Erfolg. Auch eine eventMap "set_on:on on:on set_off:off off:off" bringt nichts. Die Fhem-Version ist von heute.

Hat wer von euch einen Tipp für mich?

Danke
Didi
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: LuckyDay am 29 März 2016, 23:56:10
a. was ist denn das für ein device set HeizungExtSperren on-for-timer 630
b. wie ist denn das filelog definiert
c. wenn das event-on-change .* nicht greift, wird wohl das reading doch mehrere zustände als nur on haben

d. das reading STATE gibt es nicht
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: CoolTux am 30 März 2016, 00:17:24
Ein list der entsprechenden Devices wäre hilfreich.
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: franky08 am 30 März 2016, 00:38:36
Am at verbose auf 0 setzen, könnte helfen.
VG
Frank
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: didi-fritz am 30 März 2016, 19:15:46
Hallo,

Danke für die Antworten!

HeizungExtSperren ist ein 'normaler Actor':
list HeizungExtSperren
Internals:
   CFGFN      /opt/fhem/FHEM/fhem-technik.cfg
   DEF        1D88A802
   NAME       HeizungExtSperren
   NR         1304
   NTFY_ORDER 50-HeizungExtSperren
   STATE      off
   TYPE       CUL_HM
   chanNo     02
   device     Act_Heizraum
   Readings:
     2016-03-30 19:02:01   CommandAccepted yes
     2015-01-12 05:17:16   R-sign          off
     2016-03-30 19:02:01   deviceMsg       off (to CUL)
     2016-03-30 19:02:01   level           0
     2016-03-30 19:02:01   pct             0
     2016-03-30 19:02:01   recentStateType ack
     2013-11-02 23:30:00   running         -
     2016-03-30 19:02:01   state           off
     2016-03-30 19:02:01   timedOn         off
     2016-03-30 17:35:00   why             Heizung abschalten weil warm und sonnig (WZ: 22.9  Aussen: 3.1 -> 18.1).  (930 sec)
   Helper:
     dlvlCmd    ++A011F123061D88A80202000000
     peerIDsRaw ,00000000
     Expert:
       def        1
       det        0
       raw        0
       tpl        0
     Role:
       chn        1
     Shadowreg:
Attributes:
   devStateIcon off:power_red on:power_green set_on:power_yellow_green set_off:power_yellow_red set.*:power_yellow
   event-on-change-reading .*
   eventMap   { dev=>{"set_on"=>"on"}, def=>{"set_off"=>"off"} }
   expert     0_off
   fp_fp_technik 425,540,1,Sperre
   group      Heizung
   icon       sani_heating_level_0
   model      HM-LC-SW4-PCB
   peerIDs    00000000,
   room       Technik,Unsorted
   webCmd     on:on-for-timer 18000:off:statusRequest

das FileLog sieht so aus:
list fl_Heizung
Internals:
   CFGFN
   DEF        /opt/fhem/log/Heizung.log Heizung.*:(on|off)
   NAME       fl_Heizung
   NR         4157
   NTFY_ORDER 50-fl_Heizung
   REGEXP     Heizung.*:(on|off)
   STATE      active
   TYPE       FileLog
   currentlogfile /opt/fhem/log/Heizung.log
   logfile    /opt/fhem/log/Heizung.log
Attributes:

und im Log finde ich dann:

2016-03-30_18:30:00 HeizungExtSperren on
2016-03-30_18:30:00 HeizungExtSperren on
2016-03-30_18:25:00 HeizungExtSperren on
2016-03-30_18:25:00 HeizungExtSperren on
2016-03-30_18:20:00 HeizungExtSperren on
2016-03-30_18:20:00 HeizungExtSperren on


mir ist bekannt, dass bei Stetzen des Actors kurzzeitig der Zustand 'set_on' bzw. 'set_off' anliegt, das sollte ich ja mit der eventMap verändern können - oder liege ich hier total falsch?
Mit der eventMap '{ dev=>{"set_on"=>"on"}, def=>{"set_off"=>"off"} }' werden die Events doppelt gelogget.


Ein Verbose 0 am AT bringt leider auch keine Änderung.

Danke
Didi
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: CoolTux am 30 März 2016, 20:02:07
Dein webcmd finde ich etwas ungewöhnlich. Wenn ich mir anschaue wie es beschrieben ist passt Deins nicht wirklich rein. Das eventMap nimm auch mal bitte raus.
Klappt Dein webcmd denn?

Was ist !it dem at ?
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: didi-fritz am 30 März 2016, 20:56:42
ja, das webCmd klappt! :)

Ohne dem eventMap werden die Zeilen nur einmal geloggt, weil ja der Zustand "set_on" ja nicht im FileLog-Filter ist. Ohne eventMap ist mir auch das Verhalten einigermaßen klar, weil der Zustand zwischen "on" und dem nicht geloggten "set_on" wechselt.

Das at ruft nur alle 5 Minuten 2 Funktionen aus meiner 99_myUtilsTechnik.pm auf.  Diese beiden Funktionen werten einige FHEM-Devices (Wetter,Sonnensensor, Anwesenheit, ..) aus und rufen dann fhem("set HeizungExtSperren on-for-timer 630") auf.
list a_Heizung_ein_aus_wenn
Internals:
   CFGFN      /opt/fhem/FHEM/fhem-technik.cfg
   COMMAND    {
    heizung_aus_wenn();
    heizung_ein_wenn();
}
   DEF        +*00:05:00 {
    heizung_aus_wenn();
    heizung_ein_wenn();
}
   NAME       a_Heizung_ein_aus_wenn
   NR         1322
   NTM        20:50:00
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 20:50:00
   TIMESPEC   00:05:00
   TRIGGERTIME 1459363800
   TRIGGERTIME_FMT 2016-03-30 20:50:00
   TYPE       at
   Readings:
     2016-03-30 20:45:00   state           Next: 20:50:00
Attributes:
   alignTime  00:05
   disable    0
   group      Heizung
   icon       hourglass
   room       Technik
   verbose    0
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: CoolTux am 30 März 2016, 21:34:15
Interessant, denn alle 5 Minuten kommen ja auch die Einträge im Log.

Lass uns mal am Code Teil haben bitte
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: didi-fritz am 30 März 2016, 22:05:36
die 5-Minuten logs kommen, weil ich (wenn alle meine Bedingungen passen) ein 'fhem(set "HeizungExtSperren on-for-timer 630")' wiederhole, um die on-Zeit des Actors zu verlängern


sub heizung_ein_wenn  # { heizung_ein_wenn() }
{
     my ($sec,$min,$hour,$tag,$monat,$jahr,$wday,$yday,$isdst) = localtime(time);
     my $hz_ein = 0;
     my $why="";
     my $timer=310;

     if ( Value("Heizungs_Automatic") eq "ein" && bewohnt() )
     {
          if ( wochentags_zuhause() && $hour > 6  &&  $hour < 21 )
          {
              $hz_ein = 1;
              $why .= "Heizung tagsueber einschalten weil wochentags_zuhause. ";
          }

          ###

          if ( arbeitstag() )
          {
              if ( time_bin_anwesend() == 1 ) # 0.. abwesend, 1.. anwesend, 9..undef
              {
                 $hz_ein = 1;
                 $why .= "Heizung eingeschaltet weil anwesend (time_bin_anwesend). ";
              }
          }

          ### ### ###

          if ( $hz_ein == 1 )
          {
              Log 2, $why  if ( ReadingsVal("HeizungExtAnforderung","state","off") eq "off" );

              fhem("set HeizungExtAnforderung on-for-timer $timer");
              fhem("setreading HeizungExtAnforderung why $why ($timer sec)");
              return $why;
          } 
 
          return "Heizung unveraendert";
     }
     return "Heizung skipped";
}

###-----------

sub heizung_aus_wenn() # { heizung_aus_wenn() }
{
     my $temp_wz = ReadingsVal("s_Raum_WZ","temperature",0);
     my ($sec,$min,$hour,$tag,$monat,$jahr,$wday,$yday,$isdst) = localtime(time);
     my $hz_aus = 0;
     my $why="";
     my $timer=310;

     if ( Value("Heizungs_Automatic") eq "ein"  &&   $temp_wz > 10)
     {   
         if ( !bewohnt()  )
         {
              if ( fhem("get cal_nicht_zuhause tomorrow" ) ne "none"  &&  $hour < 23 )
              {   # morgen auch noch abwesend
                  $hz_aus = 1;
                  $why .= "Heizung bis 23:00 abschalten weil nicht zuhause. ";
              }
              elsif (  $hour < 14 )
              {       
                  $hz_aus = 1;
                  $why .= "Heizung bis 14:00 abschalten weil nicht zuhause. ";   
              }
         }

         ####

         my $binextern=Value("TimeBinExtern");     
   
         if (  $binextern ne "disabled" )
         {
              $why .= "Heizung abschalten weil nicht zuhause (TimeBinExtern: $binextern). ";   
              $hz_aus = 1;
          }

          ####

          my $temp_aussen = ReadingsVal("THS_aussen","temperature",0);
          my $temp_aussen_min = ReadingsVal("THS_aussen","T_min_day",$temp_aussen);

          if ( $temp_wz > 20  &&  $temp_aussen > 12  &&  ( $temp_aussen - $temp_aussen_min) > 8  &&  is_sonne() )
          {
              $why .= "Heizung abschalten weil warm und sonnig (WZ: $temp_wz  Aussen: $temp_aussen_min -> $temp_aussen). ";   
              $hz_aus = 1;
              $timer *= 3;  # 3 perioden um bei kleinen wolken nicht zu schalten
          } 
   
          ####

          my $temp_vorschau = ReadingsVal("WetterVorschau","fc1_high_c",20);

          if ( $temp_wz > 20  &&  $temp_vorschau >= 21 && $hour < 13 )
          {
              $why .=  "Heizung abschalten bis Mittag weil Wetterbericht gut (Vorschau: $temp_vorschau). ";   
              $hz_aus = 1;
          }

          ### ### ###

          if ( $hz_aus == 1 )
          {   
              Log 2, $why if ( Value("HeizungExtSperren")  eq "off" );
             
              fhem("set HeizungExtSperren on-for-timer $timer");
              fhem("setreading HeizungExtSperren why $why ($timer sec)");

              return $why;
          }else
          {
              if ( Value("HeizungExtSperren")  eq "on" && bewohnt() )
              {
                  my $w=ReadingsVal("HeizungExtSperren", "why", "?");
                  Log 2, "Heizung wieder auf automatic ($w)";   
              }
          }
          return "Heizung unveraendert";
     }
           
     return "Heizung skipped";
}

Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: CoolTux am 30 März 2016, 22:13:35
Aber dann hast Du doch Deine Antwort warum alle 5 Minuten das on kommt im Log. Dann passen alle Deine Bedingungen und er schaltet ein on.
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: didi-fritz am 30 März 2016, 22:41:25
Der Actor ist ja bereit auf "on". Und bevor der on-timer abläuft verlängere ich um weitere 630 Sekunden.

Mich stört nur das Logging alle 5 Minuten. Deshalb hab ich versucht, den Zustandswechsel von "on" auf "(set_)on" und wieder auf "on"  mit den "event-on-change-reading .*" zu ünterdrücken
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: franky08 am 30 März 2016, 22:48:11
Wenn der Actor auf on ist und du nach triggerst wirst du auch eine Eintrag im Log haben oder du setzt auf alle devices verbose auf 0, ob das funktioniert ist aber ein Schuss ins Blaue.

VG
Frank
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: didi-fritz am 30 März 2016, 23:00:38
verbose 0 am HeizungExtSperren funktioniert leider nicht.

Drei mal hintereinander "set HeizungExtSperren on" ergibt 3 Logzeilen
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: franky08 am 30 März 2016, 23:08:30
ZitatDann passen alle Deine Bedingungen und er schaltet ein on.

Kannst du in den "Bedingungen" irgendwas am Log Level machen? Habe mir die sub jetzt nicht so genau angesehen. Sonst "dirty and hard", global verbose runter setzen.

VG
Frank
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: CoolTux am 30 März 2016, 23:29:56
Und Du verlängerst mit on-for-timer 630

Ich bilde mir ein, bin mir nicht sicher, ein on-for-timer ist das selbe wie ein on.  Und du sondest ein on-for-timer.
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: franky08 am 30 März 2016, 23:47:57
Ist es, bringt auf jeden Fall einen Log Eintrag. Sehe ich jeden Abend, wenn meine Frau stundenlang im Bad ist und über watchdog das Badlicht nach getriggert wird, da läuft auch ein at mit 20 min und bei erneuten motion (BW) wird nachgetriggert. Sieht dann so aus:
03.30 22:35:34 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:35:56 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:36:15 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:36:35 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:36:55 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:37:10 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:37:33 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:38:00 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:38:40 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:38:54 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:39:15 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:39:30 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:39:46 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:40:08 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:40:25 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:40:56 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:41:12 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:41:27 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:41:43 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:41:57 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:42:12 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:42:30 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:42:47 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:43:03 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:43:18 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:43:43 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:44:04 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:44:52 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:45:08 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:45:25 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:45:44 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:45:59 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:46:14 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:46:30 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:46:51 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:48:44 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:49:01 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:49:18 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:50:40 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:50:55 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:51:11 3: CUL_HM set Badlicht on-for-timer 1200
2016.03.30 22:51:26 3: CUL_HM set Badlicht on-for-timer 1200

also jedesmal auf motion.

VG
Frank
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: didi-fritz am 31 März 2016, 19:17:21
Hallo Frank,

ist dein aufgelistetes Log nicht das zentrale Logfile?
global verbose ist bei mir auf 2 und ich habe keine Einträge im zentralen Logfile.

Mein Problem ist das FileLog: def fl_Heizung FileLog /opt/fhem/log/Heizung.log Heizung.*:(on|off)
ich möchte ja die Zustandswechsel (off->on und on->off) loggen, nicht aber das nachtriggern.

Wenn du ein FileLog  "def fl_Badlicht FileLog /opt/fhem/log/Badlicht.log Badlicht:(on|off) " anlegst, hast du dann auch die wiederkehrenden "Badlicht on" im log?


lg
didi
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: franky08 am 31 März 2016, 19:21:53
Das ist das fhem Log, ich habe auf das device kein FileLog angelegt (für was auch, braucht ja keiner) arbeite sonst mit DbLog. Im "zentralen Log" also im fhem Log ist dann, wie oben geschrieben das nachtriggern auf .motion.* vom Bewegungsmelder zu sehen.
Zitatich möchte ja die Zustandswechsel (off->on und on->off) loggen, nicht aber das nachtriggern.
das dürfte schwierig werden, sehe da keine regex die da matchen könnte-- mmh?

VG
Frank
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: LuckyDay am 31 März 2016, 19:25:07
ich würde an deiner stelle nicht das state loggen , sondern das reading level

2016-03-30 19:02:01   level           0

und mit event-on-change .*
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: didi-fritz am 31 März 2016, 20:21:42
Hallo Hary,

Danke, so funktioniert's! Wieso bin ich da nicht selbst drauf gekommen?

lg didi
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: franky08 am 31 März 2016, 20:26:27
Ich aber auch nicht, das Offensichtliche sieht man manchmal nicht  :-X

VG
Frank
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: sash.sc am 19 Juni 2016, 20:41:20
Hallo zusammen.

Ich hoffe mal das mein Anliegen hier rein passt.

Ich habe für die Revolt Messteckdose NC-5462 ein event-on-change für das state eingerichtet.
D.h. sobald sich ein Wert im state ändert, wird geloggt. Ich möchte gerne aber im event-on-change für das state einen Grenzwert festlegen wie groß die Änderung sein soll. Dies ist ja auch für einzelne Readings möglich (event-on-change voltage:2,power:5,......).
Ist dies auf für Werte im state möglich, oder muss ich die einzelnen Readings mit im event-on-change einbauen ????

Gruß und danke
Sascha
Titel: Antw:Frage zu event-on-change-reading für STATE
Beitrag von: didi-fritz am 23 Juni 2016, 21:45:56
ich hab es zwar noch nie verwendet, aber könnte das nicht mit dem event-aggregator funktionieren?

didi