FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: pano am 08 April 2016, 09:38:54

Titel: PERL Konstrukt um Thermostate nacheinander zu schalten
Beitrag von: pano am 08 April 2016, 09:38:54
Hallo allerseits,

ich versuche grade den Betriebsmodus von 15 HM-CC-RT-DN durch einen "Knopfdruck" im FHEM zu verändern. In einem Perlscript habe ich dazu ein Array mit allen betroffenen Devicenamen angelegt. In einer foreach-Schleife gebe ich dann den Befehl zum ändern des Betriebsmodus und lege gleich noch ein burstXmit hinterher, weil warten ja soo langweilig ist :-)


sub heizungsprofil(){
   my @ClimaDevices = ("EG_wz_WT_Wandthermostat_Climate",
      "EG_ku_HV_Heizung_Clima","EG_fl_HV_Heizung_Clima","EG_wf_HV_Heizung_Clima","EG_wc_HV_Heizung_Clima",
      "OG_sz_HV_Heizung_Clima","OG_kz_HV_Heizung_Clima","OG_gz_HV_Heizung_Clima",
      "OG_bd_WT_Wandthermostat_Climate",
      "KG_fl_HV_Heizung_Clima","KG_wk_HV_Heizung_Clima","KG_kl_HV_Heizung_Clima","KG_gr_HV_Heizung_Clima");
   foreach(@ClimaDevices){
      fhem("set $_ controlMode day");
      fhem("set $_ burstXmit");
   }
}


Der "Knopf" wird durch einen neuen Status in einem Dummy realisiert, der ein notify triggert, das wiederum das Script aufruft.

Das Absetzen der Befehle funktioniert auch soweit, allerdings verharren dann sehr viele Devies auf CMDs-pending. Wenn ich das manuell nacheinander mache und jeweils warte bis der jeweils vorherige Thermostat auf CMDs_done wechselt, ist das alles kein Problem (natürlich immer vorausgesetzt, der loadLvl des HMLAN gibt es noch her)

Aus der Suche im Forum habe ich nun den Eindruck, dass bei der Script-Lösung die Kommandos in zu schneller Abfolge abgefeuert werden und dadurch das Problem entsteht.

Was ich also suche ist eine Möglichkeit das nächste Element der Schleife erst zu duchlaufen, wenn das grade bearbeitete Device ein CMDs_done zurückgibt. Mein Versuch innerhalb der foreach-Schleife mittels while(Devicestatus ne "CMDs_done"){sleep(15)} eine Abfrage zu bauen und dadurch die Schleife auszubremsen ist in einer Endloswait geendet und konnte nur mittels Neustart des Raspberry beendet werden.
Offenbar setzt der sleep() den kompletten fhem-Prozess lahm. Den "bösen" Code habe ich leider nicht mehr, da ich beim rumprobieren wieder rückgängig gemacht habe.


Hat jemand eine Idee, wie sich so ein "verändere den nächsten Thermostaten erst, wenn der aktuelle fertig ist" gescheit realisieren lässt?


Vielen Dank, Pano


PS: ist klar, dass ich keine perl-Granate bin, mir aber redlich Mühe geben es zu werden ;-)
Titel: Antw:PERL Konstrukt um Thermostate nacheinander zu schalten
Beitrag von: Jamo am 10 April 2016, 20:05:37
Hi Pano,
da musst Du dann wohl zurück auf FHEM Ebene, also sowas wie (Namen musst Du auf deine Devices anpssen):

define Heizung_Mode_Set notify Heizung_Mode:.* {\
  Log3 $NAME, 3, "Mode: $EVENT starting now";;\
    fhem("                             set HKT_Bad1_Clima    controlMode $EVENT");;\
    fhem("defmod atBst_01 at +00:00:20 set HKT_Flur1_Clima   controlMode $EVENT");;\
    fhem("defmod atBst_02 at +00:00:40 set HKT_Kueche1_Clima controlMode $EVENT");;\
    fhem("defmod atBst_03 at +00:01:00 set HKT_Schlaf1_Clima controlMode $EVENT")\
  }


Gruss!
Titel: Antw:PERL Konstrukt um Thermostate nacheinander zu schalten
Beitrag von: pano am 10 April 2016, 20:34:40
Hmm,  durch das at wird das ja zu einer zeitgesteuerten Abfolge. Das habe ich mittlerweile auch durch eine Aneinanderkettung von fhem sleep und device... set  realisiert bekommen.

Ist halt keine "echte"  Ereignissteuerung.  Hab auch mit dynamischem bauen von Notifys rumexperimentiert,  ist aber echt dreckig die notifys am Ende wieder aufzuräumen. :-(

Aber Danke für die Unterstützung!
Titel: Antw:PERL Konstrukt um Thermostate nacheinander zu schalten
Beitrag von: frank am 11 April 2016, 12:12:21
ZitatOffenbar setzt der sleep() den kompletten fhem-Prozess lahm.
aber nur ein perl sleep. gibt es aber schon viele thread zu.  ;)

ein sleep gefolgt von einem fhem befehl nicht. etwa so:
fhem("sleep;bla1;sleep;bla2;sleep;bla3")