Ich frage mich, ob die Verwendung von system.Exec die Ursache des nachstehenden, detailliert beschriebenen Übels, daß die Programme nicht mehr reagieren, ist. Die Aussage, ob system.Exec nun unproblematisch ist und einer Ausführung via CUxD vorzuziehen ist, könnten gegensätzlicher nicht sein.
Im Thread CCU wird träge, Programme werden nicht mehr ausgeführt bis zum Stillstand schreibt romeoalfa1975 am 08.07.2019:
„Ich hatte dasselbe Problem und habe einfach mal eine Backup-Datei an eq-3 geschickt, mit der Bitte um Hilfe. Dort hat man mich darauf aufmerksam gemacht, dass Skripte, in denen der Text "system.exec()" vorkommt, das System immer langsamer werden lassen - bis zum Stillstand. Genau das passierte bei mir immer ca. 1 Woche nach dem Neustart.“
Hingegen schreibt Jens Maus am 23.01.2018 im Thread Probleme mit CURL Befehl:
„Gerade mit neuesten CCU2 Firmwares gibt es keinerlei Grund mehr warum man system.Exec() nicht nutzen sollte. Es ist leider ein weit verbreiteter Irrglaube das system.Exec() Probleme macht. Das war in der Stärke noch nie so und seit neuesten CCU2 Firmwares mit ReGaHss Community+Standard hat man auch ein system.Exec() an der Hand das CUxD nicht mehr vermissen lässt.“
Ja, wie denn nun!? Weil Jens schrieb, dass system.Exec keine Probleme macht, habe ich den umständlichen Weg über den CUxD überall rausgeschmissen, und kratze mich nun am Kopf was ich tun soll.
Hier also meine Programme, durch die meine RaspberryMatic seit vier Tagen stillsteht.
RaspberryMatic 3.49.17.20200131
CUxD 2.3.4
RaspberryPi 3 Model B+
So, ich bin auch betroffen, und weiß ehrlich gesagt nicht, was ich tun soll. Weder wird noch irgendeines meiner Programme systemseitig ausgeführt, noch lässt es sich händisch starten. Maximaler Kack.
Ich habe bislang
- sämtliche (skriptlastigen) Programme, die ich in den letzten Tagen hinzugefügt habe, im WebUI deaktiviert, unbedienbar, unsichtbar gemacht
- verdächtige Skript-Zeilen auskommentiert
- x-fach neu gestartet
Meine nächsten Schritte wären
- die neu hinzugekommenen Programme von Neuestes bis Ältestes zu entfernen, dazwischen jedes Mal neuzustarten
- ein .sbk von vor ein paar Tagen einzuspielen, bevor ich die verursachenden Programme hinzugekommen sind.
Hier mal meine verdächtigen, ineinander greifenden Programme. Vielleicht sieht Jens Maus (Stehst Du mittlerweile eigentlich auf der eq-3-Gehaltsliste? Die sollten Dir freiwillig 8 Mille/Monat rüberschieben!) ja die Ursache des Problems.
Was macht der Quatsch?
- Fenster-Öffnungszustand überwachen
- Abhängig von der Außentemperatur nach 15, 30, 60 Minuten oder nie eine Telegram-Nachricht raushauen und sich die MsgID der Telegram-Nachricht merken
- Beim Schließen des Fensters die Telegram-Nachricht anhand der MsgID bei allen Chatgruppen-Teilnehmern wieder löschen
1. Programm: Fenster EssZi Telegram Melder (Nicht über die 7, 14, 21 Sekunden Verzögerung wundern. Das ist zum Debuggen. Normalerweise 15, 30, 60 Minuten.)
Der dreifache Skript-Teil in den Dann-Punken sieht jeweils so aus:
Code: Alles auswählen
!Fenster-offen-Timer und -Telegram-Notification-Script (temperaturabhängig) von Dr. Woo
!Teil 1/3
! SysVar für Prog "FensterTimerTelegramNotifier" ablegen
dom.GetObject('FensterName').State("Esszimmer-Fenster"); ! Name des Fensters (1. Zeile der Telegram-Benachrichtigung)
dom.GetObject('FensterStatusBezeichnung').State("Fenster EssZi Status"); ! Bezeichnung der entsprechenden Fenster Status
! Script-Teil 2/3 aufrufen - Telegram-Benachrichtigung abhängig von Außentemperatur und Öffnungsdauer erstellen & versenden
(dom.GetObject(ID_PROGRAMS).Get('FensterTelegramNotifier')).ProgramExecute();
! Script-Teil 3/3 - Telegram MsgID sichern, um Nachricht beim Schließen des Fensters zurückziehen zu können
(dom.GetObject(ID_PROGRAMS).Get('FensterTelegramMsgIDSaver')).ProgramExecute();
2. Programm: FensterTelegramNotifier Dann-Skript-Teil:
Code: Alles auswählen
!v1.3
!Fenster-offen-Timer und -Telegram-Notification-Script (temperaturabhängig) von Dr. Woo
!Inspiriert durch https://homematic-guru.de/homematic-fenster-laenger-als-15min-geoeffnet-erkennen
!Teil 2/2 - Teil 1 befindet sich jeweils in den Programmen "Fenster [...] Telegram Melder"
! SysVariablen-Zwischenspeicher (gefüllt vom einzelnen fenster_status-Programm) auslesen
var fenster_name = dom.GetObject('FensterName').Value(); ! Name des Fensters (1. Zeile der Telegram-Benachrichtigung)
var fenster_statusbez = dom.GetObject('FensterStatusBezeichnung').Value(); ! Bezeichnung der entsprechenden Fenster Status Systemvariable hier
! Zustand der SysVar "Fenster Status" mittels darin enthaltener Werteliste ändern ->
! geschlossen (0)
! offen (1)
! seit 15 Minuten auf (2)
! seit 30 Minuten auf (3)
! seit 1 Stunde auf (4)
string fenster_status = dom.GetObject(fenster_statusbez).Value();
if ((fenster_status >= 1) && (fenster_status <= 3)) {
fenster_status = fenster_status + 1;
dom.GetObject(fenster_statusbez).State(fenster_status);
}
! Telegram-Benachrichtigungs-Schema
! <= 12° .......... nach 15 min (2)
! >12 bis <=17° ... nach 30 min (3)
! >17 bis <=23° ... nach 60 min (4)
! >23° ............ nie (1)
string AktTemp = dom.GetObject('Wetter Aktuelle Temperatur').Value().ToInteger(); ! Da die Sysvar 'Wetter Aktuelle Temperatur' als ZEICHENKETTE gespeichert ist (Typ Zahl speichert mit etlichen Nachkommastellen), muss zum Rechnen zur GANZZAHL konvertiert werden -> .Value().ToInteger()
string doNotify = 1;
if ( AktTemp <= 12) { doNotify = 2; }
if ( (AktTemp > 12) && (AktTemp <= 17) ) { doNotify = 3; }
if ( (AktTemp > 17) && (AktTemp <= 23) ) { doNotify = 4; }
! --------------------
! Hier wird nun das zuvor gezeigte Benachrichtigungs-Schema (aus AktTemp) gegen den Fenster Status (seit 15/30/60 min offen) abgeglichen.
if ( ( doNotify == fenster_status ) && ( doNotify != 1) )
{
! fenster_status: Zahl-Wert in Text aus Werteliste umwandeln
var y = dom.GetObject(fenster_statusbez).ValueList();
var z = y.StrValueByIndex(";", fenster_status);
! Telegram-Meldung erstellen (wird automatisch vom Programm "Telegram Bot PushSkript" abgefeuert)
dom.GetObject ("Telegram Pusher").State ("*"#fenster_name#"*" # "\n" # z # ".\n" # dom.GetObject ("Wetterteil Telegram-Fenstermeldung").Value() # "\nBitte schließen!");
;} ! Ende der IF-Klammer
Code: Alles auswählen
!v1.0
!Teil 3/3 - Triggernder Teil 1 befindet sich jeweils in den Programmen "Fenster [...] Telegram Melder"
! Komplette Werteliste der zum Fenster gehörenden SysVar "Fenster ... Status" holen
var FensterStatus = dom.GetObject((dom.GetObject('FensterStatusBezeichnung').Value())).ValueList();
! Telegram LastMsgID in der Werteliste auf ID6 (=Position 7, da ID0=Pos 1) ablegen und zurück in SysVar "Fenster ... Status" speichern
dom.GetObject((dom.GetObject('FensterStatusBezeichnung').Value())).ValueList(FensterStatus.Replace(FensterStatus.StrValueByIndex(";", 6), dom.GetObject('Telegram LastMsgID').State()))
Code: Alles auswählen
(dom.GetObject(ID_PROGRAMS).Get('Telegram Bot RemoveSkript')).ProgramExecute();
4. Programm: Telegram Bot RemoveSkript
Code: Alles auswählen
!v1.0
!MsgID holen
string MsgID = dom.GetObject("Telegram DeleteMsgID").Value();
string s_cmd = "wget --no-check-certificate -qO- \"https://api.telegram.org/botxxxxxxx:yyyyyyyyy/deleteMessage?chat_id=zzzzzzzzz&message_id=" # MsgID # "\"";
string stdout;
string stderr;
system.Exec(s_cmd, &stdout, &stderr);
Zum Prozedere dazu gehört noch ein 5. Programm, daß eine SysVar überwacht und bei Änderung eine Telegram-Nachricht mit deren Inhalt raushaut:
5. Telegram Bot PushSkript
Code: Alles auswählen
!v1.2
! TELEGRAM-FRAMEWORK
! Credits: http://www.christian-luetgens.de/homematic/telegram/telegramframework/T-Framework.htm
object o = dom.GetObject ("Telegram Pusher");
string s = o.Value();
string stdout;
string stderr;
if (s != "") {
string s_cmd = "wget -qO- \"https://api.telegram.org/botxxxxxx:yyyyyyyyyy/sendMessage?chat_id=zzzzzzzzz&parse_mode=Markdown&text=" # s.ToUTF8().UriEncode() # "\" | jq .result.message_id";
system.Exec(s_cmd, &stdout, &stderr);
! MsgID in SysVar "Telegram LastMsgID" speichern. Trim() entfernt Zeilenumbruch hinter der MsgID.
dom.GetObject ("Telegram LastMsgID").State(stdout.Trim());
o.State (""); ! SysVar "Telegram Pusher" aus optischen Gründen wieder leeren
}