Frage zu event-on-change-reading für STATE

Begonnen von didi-fritz, 29 März 2016, 23:06:08

Vorheriges Thema - Nächstes Thema

didi-fritz

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

LuckyDay

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

CoolTux

Ein list der entsprechenden Devices wäre hilfreich.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

franky08

Am at verbose auf 0 setzen, könnte helfen.
VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

didi-fritz

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

CoolTux

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 ?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

didi-fritz

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

CoolTux

Interessant, denn alle 5 Minuten kommen ja auch die Einträge im Log.

Lass uns mal am Code Teil haben bitte
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

didi-fritz

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";
}


CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

didi-fritz

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

franky08

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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

didi-fritz

verbose 0 am HeizungExtSperren funktioniert leider nicht.

Drei mal hintereinander "set HeizungExtSperren on" ergibt 3 Logzeilen

franky08

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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net