notify mit mehreren Perl-Befehlen: CPU-Last optimieren

Begonnen von heikoh81, 07 März 2016, 23:35:37

Vorheriges Thema - Nächstes Thema

heikoh81

Hallo zusammen,

ich verwende ein notify, um bei Klick auf eine ChkBox einige Befehle abzuarbeiten (Löschen von Timern, Neusetzen von Timern).
Mir erscheint das, was das notify macht, eigentlich nicht sehr rechenintensiv.

Dennoch führt der Aufruf dazu, dass mein Raspi2 (Raspbian) für ca. 10 Sekunden 25% CPU-Last anzeigt, also ein Kern voll ausgelastet wird.
Insbesondere, wenn die dämmerungsgesteuerten Timer vorhanden sind und tatsächlich gelöscht werden müssen.
(In diesem Zusammenhang fällt mir ein: Das Löschen von Einträgen im WebUI mittels des delete-Links dauert auch immer recht lange...)

Was führt in diesem Beispiel zur hohen CPU-Last?
Und wie könnte man es optimieren?
Ähnliche CPU-Last-Probleme habe ich an anderen Stellen auch, was problematisch ist, weil dann das System erstmal nicht ansprechbar ist in dieser Zeit...


(Daemmerungssteuerung_Partybetrieb_bis_0400) {
if (Value("Dummy_HellDunkel") eq "dunkel") {
#####Partymodus#####
#Alle Timer loeschen und neue Timer bis 04:00 einrichten.
if (Value("Daemmerungssteuerung_Partybetrieb_bis_0400") eq "on") {
if ( Value("Gartenweg_Daemmerungsgesteuert_wieder_ausschalten_Temp") ne "" ) {
fhem("delete Gartenweg_Daemmerungsgesteuert_wieder_ausschalten_Temp");
}
if ( Value("Garten_Daemmerungsgesteuert_wieder_ausschalten_Temp") ne "" ) {
fhem("delete Garten_Daemmerungsgesteuert_wieder_ausschalten_Temp");
}
if ( Value("Terrasse_Daemmerungsgesteuert_wieder_ausschalten_Temp") ne "" ) {
fhem("delete Terrasse_Daemmerungsgesteuert_wieder_ausschalten_Temp");
}
if ( Value("Dachterrasse_Daemmerungsgesteuert_wieder_ausschalten_Temp") ne "" ) {
fhem("delete Dachterrasse_Daemmerungsgesteuert_wieder_ausschalten_Temp");
}
if ( Value("Lechuza_Haustuer_Daemmerungsgesteuert_wieder_ausschalten_Temp") ne "" ) {
fhem("delete Lechuza_Haustuer_Daemmerungsgesteuert_wieder_ausschalten_Temp");
}
#Gartenweg Partymodus
fhem("define Gartenweg_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp at 04:01:25 {
  if ( Value('PollinGartenweg') eq 'on' ) {
fhem('set PollinGartenweg off');;
  }
  }");   
fhem("attr Gartenweg_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp room TimerTemp");
fhem("attr Gartenweg_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp group Daemmerungsautomatik");
#Garten Partymodus
fhem("define Garten_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp at 04:01:30 {
  if ( Value('PollinWohn1Garten') eq 'on' ) {
fhem('set PollinWohn1Garten off');;
  }
  }");   
fhem("attr Garten_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp room TimerTemp");
fhem("attr Garten_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp group Daemmerungsautomatik");
#Terrasse Partymodus
fhem("define Terrasse_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp at 04:01:35 {
  if ( Value('PollinTerrassenlicht') eq 'on' ) {
fhem('set PollinTerrassenlicht off');;
  }
  }");   
fhem("attr Terrasse_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp room TimerTemp");
fhem("attr Terrasse_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp group Daemmerungsautomatik");
#Dachterrasse Partymodus
fhem("define Dachterrasse_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp at 04:01:40 {
  if ( Value('PollinDachterrasse') eq 'on' ) {
fhem('set PollinDachterrasse off');;
  }
  }");   
fhem("attr Dachterrasse_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp room TimerTemp");
fhem("attr Dachterrasse_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp group Daemmerungsautomatik");
#Lechuza Haustuer Partymodus
fhem("define Lechuza_Haustuer_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp at 04:01:40 {
  if ( Value('IntertechnoUPHaustuer') eq 'on' ) {
fhem('set IntertechnoUPHaustuer off');;
  }
  }");   
fhem("attr Lechuza_Haustuer_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp room TimerTemp");
fhem("attr Lechuza_Haustuer_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp group Daemmerungsautomatik");
#Partymodus muss absichtlich jeden Tag neu aktiviert werden, deshalb nach einmaligem Gebrauch deaktivieren.
fhem("set Daemmerungssteuerung_Partybetrieb_bis_0400 off");
}
}
}


Viele Grüße,
Heiko

chris1284

#1
ZitatDennoch führt der Aufruf dazu, dass mein Raspi2 (Raspbian) für ca. 10 Sekunden 25% CPU-Last anzeigt, also ein Kern voll ausgelastet wird.

welche cpu ist denn bei 25% voll ausgelastet? :o
rein rechnerisch würde ich meinen sind 100% volle auslastung.... ::)
auf einem system mit ausreichend leistung für fhem gehen die delet anweisungen (egal ob im web mit link als auch als befehl) eigentlich sehr schnell.

du hast halt viele (unnötige) define und delete. bei den at die eh immer zur selben zeit starten (die ab 04:01:25 und folgende) würde sich ehr eine feste, sich wiederholende definition anbieten (einfach außerhalb der funktion fest in fhem "define Gartenweg_Daemmerungsgesteuert_Partymodus_wieder_ausschalten_Temp at *04:01:25"). wannsie greifen kannst du dann per disable attr steuern
evtl habe ich was übersehn aber für mich mach es absolut keinen sinn ein at täglich immer mit der selben uhrzeit neu zu erstellen. http://fhem .de/commandref.html#at
zum deaktivieren der gazen dämmerungssteuerung reciht dann ein einfaches att disable 1 für die at. bei sinnvoller namensgebung reicht dann ein befehl wie

attr Daemmerungssteuerung_.* disable 1

für dämmerungsabhängige at bietet sich auch http://fhem.de/commandref.html#SUNRISE_EL an. hat auch den vorteil das du die at nur einmal definierst und sie dennoch "dämmerungsabhängig" ein-/ausschalten. in kombination mit on-for-timer erspart dir auch das ausschalten per script

wäre hilfreich wenn du nochmal schreibst was das ganze konstrukt für eine aufgabe hat

ph1959de

Zitat von: chris1284 am 08 März 2016, 06:41:49
zum deaktivieren der gazen dämmerungssteuerung reciht dann ein einfaches att disable 1 für die at. bei sinnvoller namensgebung reicht dann ein befehl wie

attr Daemmerungssteuerung_.* disable 1

Und wenn nicht jedesmal das rote Fragezeichen hinter dem "Save config" auftauchen soll, dann ist

set Daemmerungssteuerung_.* inactive

eine Option (vermutlich sogar die bessere; siehe auch commandref dazu).

Peter
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

chris1284

oder noch einfacher ein "SAVE" befehl nach dem siable  ;)

Starkstrombastler

wenn die Timer geändert werden müssen, dann besser mit
fhem("defmod .......
IPC\Ubuntu + Fhem, 1wire, Shellies, Siemens Logo!, Z-Wave, PhilipsTV, Vu+duo2, KM200

chris1284

offtopic:
warum mmeinst du sei defmod besser als modify? wenn ich es richtig versteheist defmod lediglich ein define welches falls das gerät schon existiert keinen fehler spuckt sondern das bestehende device ändert.
modify änder nur die feinition und der rest der deviceinfos bleibt bestehen :o

Starkstrombastler

#6
@chris1284
der Unterschied ist bei nicht periodischen Timern wichtig, da diese nach Ausführung automatisch entfernt werden. modifiy ergibt dann einen Fehler, defmod erstellt dann halt den Timer neu.

Einen weiteren Unterschied habe ich jetzt noch selbst gefunden:
Bei Anwendung von defmod auf ein bereits definiertes Device wird mit dem ? ein modifiy angezeigt,
bei Definition eines neuen Devices mit defmod wird mit dem ? nichts angzeigt.
IPC\Ubuntu + Fhem, 1wire, Shellies, Siemens Logo!, Z-Wave, PhilipsTV, Vu+duo2, KM200