Probleme mit notify und event-on-change-reading bei dummy

Begonnen von Markus M., 19 Juni 2013, 21:31:52

Vorheriges Thema - Nächstes Thema

Markus M.


Folgender Code soll den Sonnenstatus setzen, um dann mittels entsprechender notifys die Jalousien zu steuern.

define Sunstate_Calculation notify sunlight:.* { \
  fhem("set sunstate night") if(Value("sunlight") <= OldValue("sunlight") && Value("sunlight") <= 15 && Value("sunstate") == "postdusk" );; \
  fhem("set sunstate predawn") if(Value("sunlight") >= OldValue("sunlight") && Value("sunlight") >= 15 && Value("sunstate") == "night" );; \
  fhem("set sunstate dawn") if(Value("sunlight") >= OldValue("sunlight") && Value("sunlight") >= 28 && Value("sunstate") == "predawn" );; \
  fhem("set sunstate day") if(Value("sunlight") >= OldValue("sunlight") && Value("sunlight") >= 40 && Value("sunstate") == "dawn" );; \
  fhem("set sunstate sunlight") if(Value("sunlight") >= OldValue("sunlight") && Value("sunlight") >= 98 && Value("sunstate") == "day" );; \
  fhem("set sunstate day") if(Value("sunlight") <= OldValue("sunlight") && Value("sunlight") <= 92 && Value("sunstate") == "sunlight" );; \
  fhem("set sunstate dusk") if(Value("sunlight") <= OldValue("sunlight") && Value("sunlight") <= 40 && Value("sunstate") == "day" );; \
  fhem("set sunstate postdusk") if(Value("sunlight") <= OldValue("sunlight") && Value("sunlight") <= 28 && Value("sunstate") == "dusk" );; }


sunstate ist analog zu sunlight so definiert:
define sunstate dummy
attr sunstate event-on-change-reading state
...


Der Sonnenstatus ändert sich über den Tag auch wie vorgesehen.

Sichtbar wird das Problem allerdings, wenn ich versuche, etwas damit zu steuern:
define blinds_day notify sunstate:day { \
  fhem "set switch_livingroom_window on;;";; \
...


Dieser Schaltvorgang wird bei jedem Update von sunlight/sunstate ausgeführt.
"event-on-change-reading state" das bei beiden dummys definiert ist, greift schlicht nicht.
Das notify auf sunstate springt selbst dann an, wenn eigentlich überhaupt kein Wert gesetzt werden sollte, weil durch den jeweils ltzten Check in jeder Zeile von Sunstate_Calculation kein gleicher Wert "überschrieben" werden dürfte.

Hat jemand eine Idee, woran das liegen kann bzw. einen Lösungsansatz?
Aktuell weder Smarthome noch FHEM vorhanden

rudolfkoenig

Oder kuerzer formuliert:
  attr sunstate event-on-change-reading state
ist wirkungslos.
Generell kann man sagen, event-on-change-reading funktioniert nicht fuer set.

Ich habe das (hoffentlich ohne unbeabsichtigten Nebenwirkungen) gefixed und eingecheckt, ab morgen per update verfuegbar.

Markus M.

Cool, Danke!

Abgesehen davon war mein Code natürlich auch noch riesengroßer Mist ;)
Strings werden mit eq verglichen, nicht mit ==.
Bei Versuch 1 wurden deshalb bei jedem notify-Durchlauf mehrere Werte hintereinander zugewiesen.
Versuch 2 (nicht gezeigt) hat dann noch mehrmals den gleichen Wert gesetzt.
Versuch 3 sieht schon besser aus:
define Sunstate_Calculation notify sunlight:.* { \
  if(Value("sunlight") <= OldValue("sunlight") && Value("sunlight") <= 15 && Value("sunstate") eq "postdusk" ) {fhem("set sunstate night");;Log 1, "night";;} \
  elsif(Value("sunlight") >= OldValue("sunlight") && Value("sunlight") >= 15 && Value("sunstate") eq "night" ) {fhem("set sunstate predawn");;Log 1, "predawn";;} \
  elsif(Value("sunlight") >= OldValue("sunlight") && Value("sunlight") >= 28 && Value("sunstate") eq "predawn" ) {fhem("set sunstate dawn");;Log 1, "dawn";;} \
  elsif(Value("sunlight") >= OldValue("sunlight") && Value("sunlight") >= 40 && Value("sunstate") eq "dawn" ) {fhem("set sunstate day");;Log 1, "day";;} \
  elsif(Value("sunlight") >= OldValue("sunlight") && Value("sunlight") >= 95 && Value("sunstate") eq "day" ) {fhem("set sunstate sunlight");;Log 1, "sunlight";;} \
  elsif(Value("sunlight") <= OldValue("sunlight") && Value("sunlight") <= 92 && Value("sunstate") eq "sunlight" ) {fhem("set sunstate day");;Log 1, "day";;} \
  elsif(Value("sunlight") <= OldValue("sunlight") && Value("sunlight") <= 40 && Value("sunstate") eq "day" ) {fhem("set sunstate dusk");;Log 1, "dusk";;} \
  elsif(Value("sunlight") <= OldValue("sunlight") && Value("sunlight") <= 28 && Value("sunstate") eq "dusk" ) {fhem("set sunstate postdusk");;Log 1, "postdusk";;} }


Das funktioniert auch schon mal soweit.
Aktuell weder Smarthome noch FHEM vorhanden

Markus M.

Eben ist mir (nach dem SVN Update) etwas aufgefallen: Meine Rolladenschaltung triggert beim Klick auf das Icon (oder up/down) doppelt.

2013-06-20 20:28:22 TRX_LIGHT blind_livingroom_window on
2013-06-20 20:28:22 dummy switch_livingroom_window on
2013-06-20 20:28:22 TRX_LIGHT blind_livingroom_window on
2013-06-20 20:28:22 dummy switch_livingroom_window on
2013-06-20 20:28:25 TRX_LIGHT blind_livingroom_window on
2013-06-20 20:28:25 TRX_LIGHT blind_livingroom_window on


Ich klicke den Dummy:
define switch_livingroom_window dummy
attr switch_livingroom_window eventMap up:on down:off
attr switch_livingroom_window webCmd up:down


Der steuert über notify den Aktor:
define blind_livingroom_window_down_switch notify switch_livingroom_window:down.* { \
  if( Value("window_livingroom") eq "Closed" ) { \
    fhem "set blind_livingroom_window off;;sleep 3;;set blind_livingroom_window off" \
  } \
  else { \
    sound"livingroom";; \
    sound"windowopen";; \
  } \
}


Die doppelte Schaltung hat den Nebeneffekt dass die Hälfte der Jalousien durch den zu kurzen Impuls nicht schaltet, weshalb ich mir sicher bin dass das erst seit dem Update auf 3308 auftritt.

Vielleicht kannst du dir das ja nochmal ansehen.
Aktuell weder Smarthome noch FHEM vorhanden

Markus M.

Gegen #3307 getestet - liegt leider definitiv an deinem Update.
Aktuell weder Smarthome noch FHEM vorhanden

rudolfkoenig

Das mag zwar sein, ich sehe aber noch keiner Fehler. Mit den von dir geposteten Definitions-Schnipsel kann bekomme ich (nach inform im telnet) beim Klick auf up/down nur
dummy switch_livingroom_window on
dummy switch_livingroom_window off

und das auch nur jeweils einmal.

rudolfkoenig

Hab mit der Beschreibung aus http://forum.fhem.de/index.php?t=rview&th=13437 nachstellen koennen, und habs auch gefixed, steht per update zur Verfuegung, bitte testen.

achim-e

#7
Hallo zusammen,

auch wenn das Thema hier schon 5 Jahre alt ist, hänge ich mich mal hier an. Mein Problem ist nämlich sehr ähnlich, daher denke ich dass Anhängen besser ist als ein neues Thema zu eröffnen.

Vorneweg: mein FHEM läuft inkl. Rollladensteuerung, Homematic usw. sehr gut und weitgehend problemfrei. Sowohl FHEM als auch Raspbian auf dem Pi3 sind auf aktuellem Stand. Allerdings habe ich ein Problem mit der Realisierung eines "virtuellen" Sonnensensors.

Folgendes möchte ich realisieren: An Redemacher Duofern Comfort-Geräte kann man einen Sonnensensor anschließen. Dieser zeigt durch ein Event (startSun bzw. endSun) den Start bzw. das Ende der überstiegenen Helligkeit an. Dieses Event nutze ich, um einen "virtuellen" Sonnensensor (dummy) an bzw. aus zu schalten. Sobald sich der Zustand des Dummys ändert möchte ich wiederrum andere Rollläden runter bzw. hoch fahren, an denen kein Sensor verbaut ist (bzw. nicht angeschlossen werden kann).

Was klappt ist: Das notify der Rollladensteuerung (hier: Device "AZ_Rolladen_Vorne") löst notify (hier: "n_AZ_Rolladen_Vorne_SunEvent") aus. Das notify schaltet den Dummy "Sonnensensor_Vorne" (Zustand im fhem Webinterface stimmt).

Was nicht klappt: Die Änderung im "Sonnensensor_Vorne" löst nicht das zugeordnete notify "n_Sonnensensor_Vorne" aus. Weder im zugehörigen Filelog, noch im FHEM-Log ist ein Eintrag drin. Triggere ich den "Sonnensensor_Vorne" aber manuell, so wird das notify ausgelöst!? Wenn ich das Filelog richtig lese, werden beim manuellen Trigger sogar alle vorherigen Trigger (Sonnensensor durch notify verändert) alle auch noch im Log verzeichnet.

Hier meine einzelnen Parts im Detail:

Device "AZ_Rolladen_Vorne"
Internals:
   CODE       7000B0
   DEF        7000B0
   IODev      Rademacher_USB
   LASTInputDev Rademacher_USB
   MODEL      Troll Comfort DuoFern
   MSGCNT     44
   NAME       AZ_Rolladen_Vorne
   NR         92
   Rademacher_USB_MSGCNT 44
   Rademacher_USB_RAWMSG 0FFF0F230F000004583C1B123400047115C0FFFFFF01
   Rademacher_USB_TIME 2018-05-01 21:22:00
   STATE      closed
   SUBTYPE    Troll Comfort DuoFern
   TYPE       DUOFERN
   READINGS:
     2018-05-01 21:21:59   blindsMode      off
     2018-05-01 21:21:59   dawnAutomatic   off
     2018-05-01 21:21:59   duskAutomatic   off
     2018-05-01 19:40:44   event           endSun
     2018-05-01 21:21:59   manualMode      off
     2018-05-01 21:21:59   motorDeadTime   off
     2018-05-01 21:21:59   moving          stop
     2018-05-01 21:21:59   position        100
     2018-05-01 21:21:59   rainAutomatic   off
     2018-05-01 21:21:59   rainDirection   up
     2018-05-01 21:21:59   rainMode        off
     2018-05-01 21:21:59   reversal        off
     2018-05-01 21:21:59   runningTime     27
     2018-05-01 21:21:59   state           closed
     2018-05-01 21:21:59   sunAutomatic    on
     2018-05-01 21:21:59   sunMode         off
     2018-05-01 21:21:59   sunPosition     60
     2018-05-01 21:21:59   timeAutomatic   off
     2018-05-01 21:21:59   ventilatingMode off
     2018-05-01 21:21:59   ventilatingPosition 88
     2018-05-01 21:21:59   version         1.6
     2018-05-01 21:21:59   windAutomatic   off
     2018-05-01 21:21:59   windDirection   up
     2018-05-01 21:21:59   windMode        off
   helper:
Attributes:
   IODev      Rademacher_USB
   event-on-change-reading .*
   genericDeviceType blind
   icon       fts_shutter_40
   room       DEV_DUOFERN,OG_Arbeitszimmer,Homekit


Vom Device "AZ_Rolladen_Vorne" ausgelöstes notify "n_AZ_Rolladen_Vorne_SunEvent":
define n_AZ_Rolladen_Vorne_SunEvent notify AZ_Rolladen_Vorne:event.* {\
  Log 3, "$NAME: notify ausgeloest ($EVENT).";;\
  if ($EVTPART1 eq "startSun") {\
    Log 3, "---> Check: EVTPART1=$EVTPART1 should be startSun";;\
    fhem("set Sonnensensor_Vorne on");;\
  } elsif ($EVTPART1 eq "endSun") {\
    Log 3, "---> Check: EVTPART1=$EVTPART1 should be endSun";;\
    fhem("set Sonnensensor_Vorne off");;\
  }\
}
attr n_AZ_Rolladen_Vorne_SunEvent addStateEvent 1
attr n_AZ_Rolladen_Vorne_SunEvent room DEV_DUOFERN


Zu schaltender Dummy (virtueller Sonnensensor):
Internals:
   NAME       Sonnensensor_Vorne
   NR         559
   STATE      off
   TYPE       dummy
   READINGS:
     2018-05-01 21:21:31   state           off
Attributes:
   devStateIcon on:weather_sun@yellow off:weather_cloudy@grey
   event-on-change-reading .*
   genericDeviceType switch
   room       DEV_DUOFERN
   webCmd     on:off


Notify des virtuellen Sonnensensors (soll hier z.B. den Küchenrollladen steuern, wird aber leider nur beim manuellen Triggern ausgelöst):
define n_Sonnensensor_Vorne notify Sonnensensor_Vorne:.* {\
  Log 3, "$NAME: notify ausgeloest ($EVENT)";;\
  if (Value("Sonnensensor_Vorne") eq "on") {\
    Log 3, "---> Check: should be on.";;\
    fhem ("set KU_Rolladen sunMode on");;\
  } else {\
    Log 3, "---> Check: should be off.";;\
    fhem ("set KU_Rolladen sunMode off");;\
  }\
}
attr n_Sonnensensor_Vorne addStateEvent 1
attr n_Sonnensensor_Vorne room DEV_DUOFERN


Wäre super, wenn jemand einen Tipp für mich hätte. Ich sehe den Fehler einfach nicht und hoffe nicht, dass es nur ein ganz dummes Ding ist...

Danke und VG
Achim