1000 Dank für Eure Ideen.
Bevor ich was zu den Punkten sagen kann, möchte ich nochmal auf die Rahmenparameter hinweisen unter denen das Problem aufgetreten ist.
Meine Homematic Installation läuft seit 4 Jahren nahezu unverändert.
Seit 3 Jahren läuft sie nahezu unverändert auf RM auf einem Raspi 3b.
Bislang problemfrei. Das Problemverhalten kommt also auf keinen fall durch ein neulich hinzugefügtes Programm oder eine Funktion oder ähnliches.
@Olsmatic: Child Prozesse konnte ich keine entdecken.
Davon abgesehen das ich in CuxD nicht soooo firm bin, konnte ich nichts weiter auffälliges entdecken.
@MichaelN & @Xel66: Zum Thema externe Kommunikation:
Thema 1: Den Tip von shartelt hatte ich wie beschrieben umgesetzt und die 3 OWM Skripts deaktiviert. Abends deaktiviert. Am nächsten morgen das typische Problemverhalten. Ich schlussfolgere daraus, das es die OWM Programme nicht gewesen sind, habe sie aber immer noch inaktiv.
Thema 2: Kommunikation in Programmen nach extern. = Ich kann keine weiteren Programme finden die dies tun.
Thema 3: Kommunikation an Netzwerkgeräte:
- ein Programm sendet folgendes auf einen Tastendruck hin:
Code: Alles auswählen
string url="http://192.168.0.67:80/tm/http?JomoSchrank=1";
system.Exec("wget -q -O /dev/null '"#url#"' &");
- dann ein Programm welches per knopfdruck den logitech media server auf dem NAS ansteuert.
Code: Alles auswählen
string url="http://192.168.0.11:9002/index.html?player=b8%3A27%3Aeb%3A81%3A36%3A50&p0=stop";
dom.GetObject("CUxD.CUX2801001:10.CMD_EXEC").State("wget -q -O - '"#url#"'");
Zum Thema:
Code: Alles auswählen
CUX2801001:9 rmax(65535) t(7200s) p(0)
KEY-SHORT CMD_SHORT((echo '00*'; usleep 50000) | telnet 192.168.0.12:9090 status)
Ich vermute zu wissen was er tut: Über Telnet eine Verbindung zu meinem NAS aufzubauen.
Jedoch konnte ich in keinem meiner Programme die Nutzung von Kanal 9 finden.
@g55 Wenn ich das in der Shell laufen lasse kommt unmittelbar eine Reaktion mit "verbunden".
@g55: Was meinst Du mit "vielen" CuxD commands? Ich zähle 4 (inklusive Programme vlt. 5 oder 6). Sind das schon viele?
Systeminfos zur vollen Minute? Meinst Du zu jeder vollen Minute ? Denn das Programm läuft nur alle 5 Minuten.
Was da alle 5 Minuten läuft ist :
Code: Alles auswählen
!Auslastung
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("cat /proc/loadavg");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var x = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
var eins = (x.Substr(0,4).ToFloat()*100);
var zwei = (x.Substr(5,4).ToFloat()*100);
var drei = (x.Substr(10,4).ToFloat()*100);
dom.GetObject("y_CCU_Ausastung_1min").State(eins);
dom.GetObject("y_CCU_Ausastung_5min").State(zwei);
dom.GetObject("y_CCU_Ausastung_15min").State(drei);
!Uptime
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("cat /proc/uptime");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
integer tmpA = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
integer tmpB = tmpA.StrValueByIndex(" ",0 ) ;
tmpB=tmpB.ToInteger();
integer tmpC=tmpB/86400;
tmpB=tmpB-(tmpC*86400);
dom.GetObject("y_CCU_Uptime").State(tmpC);
!Gesamter Speicher
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("cat /proc/meminfo | grep 'MemTotal:'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var y = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
y = y.Substr(15,12);
var vier = (y.Substr(0,6).ToFloat()/1).ToString(0)#" MB";
dom.GetObject("y_CCU_total_mem").State(vier);
!Verfügbarer Speicher
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("cat /proc/meminfo | grep 'MemAvailable:'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var z = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
z = z.Substr(15,12);
var fuenf = (z.Substr(0,6).ToFloat()/9.94132);
dom.GetObject("y_CCU_available_mem").State(fuenf);
!Freier Speicher
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("cat /proc/meminfo | grep 'MemFree:'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var w = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
w = w.Substr(15,12);
var sechs = (w.Substr(0,6).ToFloat()/9.94132);
dom.GetObject("y_CCU_free_mem").State(sechs);
! CPU-Temperatur Raspberry Pi3 auslesen mit vcgencmd measure_temp
string command = "/usr/bin/vcgencmd measure_temp | awk '// { printf substr($1, length($1) -5, 4)}'";
dom.GetObject ("CUxD.CUX2801001:6.CMD_SETS").State (command);
dom.GetObject ("CUxD.CUX2801001:6.CMD_QUERY_RET").State (1);
dom.GetObject ("y_CCU_CPU_Temp_Zahl").State (dom.GetObject ("CUxD.CUX2801001:6.CMD_RETS").State());
!dom.GetObject ("Temperatur Raspberry").State (dom.GetObject ("y_CCU_CPU_Temp_Zahl").Value().ToString().Substr(0,5));
!Püft ob eine neue FW Version vorhanden ist
var url = "https://gitcdn.xyz/repo/jens-maus/RaspberryMatic/master/release/LATEST-VERSION.js";
! Firmwareupdate auslesen und reagieren (c) by Alchy
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("cat /boot/VERSION");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var sold = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State().StrValueByIndex("=",1).Substr(0,16);
dom.GetObject("CUxD.CUX2801001:2.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:2.CMD_QUERY_RET").State(1);
var snew = dom.GetObject("CUxD.CUX2801001:2.CMD_RETS").State().StrValueByIndex("'",1);
if (sold.Find(snew) == 0)
{ dom.GetObject("CCUsysVar_Firmware_Betriebsstand").State(sold);
dom.GetObject("CCUsysVar_Firmware_verfuegbar").State(snew);
dom.GetObject("CCUsysVar_Firmware_Neue_Version_vorhanden").State(false);}
else { dom.GetObject("CCUsysVar_Firmware_Betriebsstand").State(sold);
dom.GetObject("CCUsysVar_Firmware_verfuegbar").State(snew);
dom.GetObject("CCUsysVar_Firmware_Neue_Version_vorhanden").State(true); };
!Schreibt die Anzhal an Service und Alarmmeldungen in Systemvariablen
var AnAM = dom.GetObject(40).Value();
dom.GetObject("CCUsysVar_CCU_Alarmmeldungen").State(AnAM);
var AnSM = dom.GetObject(41).Value();
dom.GetObject("CCUsysVar_CCU_Servicemeldungen").State(AnSM);
!Schreibt Systemzeit und Datum in Variable
var obj = dom.GetObject("CCUsysVar_CCU_Systemzeit_Tag");
string datzeit = system.Date("%d.%m.%Y");
obj.State(datzeit);
Ich hatte das Abholen der Versionsnummer (da skriptbasiert und auch ein CCU "Zustand") mit in das Gesamtskript von oben gepackt um die Anzahl der Programme die insgesamt in der CCU liegen nicht unnötig hochzuschrauben.
Ich vermute ich sollte diesen Teil in ein seprates Programm schieben, das nur 1 mal am Tag (in der Nacht ) läuft , oder?
Müsste ich deine Timerempfehlung dann in das Script oben mit einbauen oder auf das command des CuxD Kanals?
Laienhaft vermute ich das die skripte den Inhalt der Commands auf den Kanälen erzeugen, dann würde es ja nur Sinn machen es in den scripten zu ändern, oder?
Da alle die CCU Statuswerte in einem einzigen Programm (siehe oben) abgefragt werden, habe ich dann etwas gewonnen, diese nicht weiter zur vollen Minute alle 5 Minuten laufen zu lassen, es würde die Auswertungslast für die Skript Engine doch dann nur "verlagern" und das war zuvor auch nie ein Problem.
Die CuxD aufrufe zu deaktivieren, würde ich dann über das deaktivieren der Programme machen die auf die Kanäle zugreifen, richtig?
Das CallBack Thema müsste ich mir erstmal in ruhe ansehen........
Deinen letzten Tip "die CuXD Commands" in der Shell laufen zu lassen habe ich nicht ganz verstanden.
Soll ich die einzelnen Skripte aus dem Programm oben alle mal in der Shell laufen lassen? Geht das überhaupt? Sorry für die dumme Frage.
DANKE !!!! AN ALLE!!!