system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)

Moderatoren: jmaus, Co-Administratoren

Wookbert
Beiträge: 195
Registriert: 10.05.2013, 18:40
Hat sich bedankt: 1 Mal

system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von Wookbert » 29.02.2020, 21:02

Ich habe mein nachstehendes Problem schon einmal im Thread Programme werden nicht mehr ausgeführt beschrieben, da mein Beitrag da aber auf Seite 17 steht und offensichtlich keine Beachtung mehr findet, hier jetzt nochmal als frischer Post/Thread.

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
Es hilft alles nix: Sämtliche Programme bleiben tot.

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.
Ich würde damit aber evtl. warten, falls Jens Maus @jmaus (oder ein Mitarbeiter von eq-3) Interesse an Log-Files hätte und mir eine Anleitung an die Hand gibt, was genau ich tun muss, um die Log-Files zu generieren, wie und wo ich an diese rankomme (SSH? FTP?).

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
Das Ganze habe ich modular angelegt, damit ich beliebig viele Fenster hinzufügen kann, wobei ich die wichtigen Programme aber möglichst global vorhalte, damit ich Änderungen/Korrekturen nicht x Mal für jedes Fenster wiederholen muss.



1. Programm: Fenster EssZi Telegram Melder
Programm 1.png
(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
Programm 2.png
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
3. Programm: FensterTelegramMsgIDSaver
Programm 3.png

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()))
Das funktionierte soweit alles gut, kollabiert (= alle Programme tot) ist es meines Erachtens, nachdem ich im 1. Programm unter Sonst > Systemzustand: Fenster EssZi Status > sofort > geschlossen, ein Skript hinzugefügt habe, das das nachstehende 4. Programm zum Löschen der bereits versandten Telegram-Nachricht aufgeruft:

Code: Alles auswählen

(dom.GetObject(ID_PROGRAMS).Get('Telegram Bot RemoveSkript')).ProgramExecute(); 
(Im obigen Screenshot von Programm 1 nicht zu sehen, auf der Fehlersuche schon wieder entfernt).

4. Programm: Telegram Bot RemoveSkript
Programm 4.png

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
}
Zuletzt geändert von Wookbert am 01.03.2020, 00:57, insgesamt 1-mal geändert.

Hütte
Beiträge: 409
Registriert: 08.02.2017, 11:08
Hat sich bedankt: 9 Mal
Danksagung erhalten: 30 Mal

Re: system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von Hütte » 29.02.2020, 21:46

Mach mal in deinem ersten Programm aus dem "Sonst"-Zweig einen "Sonst-Wenn"-Zweig, bei dem du sowohl den Boot-Zustand als prüfst und den TFK als Trigger ("geschlossen" und bei "Änderung auslösen" benutzt), um deine SV zu setzen. Ansonsten wird dieser Zweig z.B. beim Neustart der Zentrale immer ausgeführt und du startest damit die nachfolgenden Programme. Ich benutzte bei mir nicht Telegram zur Benachrichtigung, aber ich könnte mir gut vorstellen, dass du dann Befehle an telegram absetzt, die unvollständig sind, z.B. weil keine Message-ID vorhanden ist, um die bei Telegram zu löschen.

Einfache "Sonst"-Zweige sollte man in den Programmen weitestgehend vermeiden, speziell dann, wenn man in allen anderen Zweigen den Bootzustand abprüft, weil sie immer ausgeführt werden, wenn das Programm ausgeführt wird und alle anderen Bedingungen falsch sind.

Aber vielleicht liegt die Ursache auch gar nicht am Aufruf von system.Exec(): Vielleicht "spuckt" dir die Ausführung anderer CCU-Programme über ProgramExecute() in die Suppe. Vielleicht wäre es geschickter, dass das jeweilige Programm eine SV mit einem bestimmten Wert setzt und das nächste Programm durch diese SV getriggert wird statt direkt aufgerufen zu werden.

Benutzeravatar
jmaus
Beiträge: 5932
Registriert: 17.02.2015, 14:45
System: Alternative CCU (RaspberryMatic etc.)
Wohnort: Dresden
Hat sich bedankt: 14 Mal
Danksagung erhalten: 324 Mal
Kontaktdaten:

Re: system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von jmaus » 29.02.2020, 21:56

Du solltest bei den Fällen wenn deine system.Exec() aufrufe die stdout/stderr ausgaben nicht benötigen am ende des kommandostrings ein & hinzufügen ind den &stdout,&stderr als parameter weglassen dann stellst du damit sicher das das system.Exec() nicht blockierend ausgeführt wird was bei einem wget aufruf schon mal lange dauern könnte. Und wenn ein aufrufendes kommando einen timeout zulässt solltest du einen eingeben weil wenn du z.b. system.Exec(" sleep 100000"); aufrufst wirst du feststellen das diese kommando die gesamte ReGa blockieren wird, wohingegen der Aufruf system.Exec("sleep 100000 &"); die rega nicht blockieren wird und trotzdem das sleep aufgerufen wird.
RaspberryMatic 3.51.6.20200621 @ ESXi mit ~180 HomeMatic Geräten + ioBroker – GitHubGitHub Sponsors / PayPalTwitter

Wookbert
Beiträge: 195
Registriert: 10.05.2013, 18:40
Hat sich bedankt: 1 Mal

Re: system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von Wookbert » 03.03.2020, 04:23

Ich weiß nicht, ob es aufgefallen ist, aber ich leider waren die oben abgebildeten Programm-Screenshots zunächst durcheinander/in falscher Reihenfolge. Jetzt korrigiert.
jmaus hat geschrieben:
29.02.2020, 21:56
... Und wenn ein aufrufendes kommando einen timeout zulässt solltest du einen eingeben weil wenn du z.b. system.Exec(" sleep 100000"); aufrufst wirst du feststellen das diese kommando die gesamte ReGa blockieren wird, wohingegen der Aufruf system.Exec("sleep 100000 &"); die rega nicht blockieren wird und trotzdem das sleep aufgerufen wird.
Danke für die Antwort, auch wenn ich sie als Nicht-Programmierer nur bedingt verstehe (weil: Was mache ich, wenn das nachfolgende Programm, auf die erfolgreiche Ausführung der system.Exec angewiesen ist!?) Spende für das unermüdliche Engagement ist am 01.03. raus.
  1. Wie kann ich feststellen, welcher Programmteil/welches system.Exec in welchem Program die CCU zum Stillstand bringt?
  2. Und wie den dazugehörigen Prozess identifizieren und killen?
  3. Kann es sein, daß ein solcher – ich habe im Forum wiederholt den Begriff „Zombie-Prozess“ gelesen – einen CCU-Neustart überlebt, was der Grund ist, weshalb die CCU auch nach einem Neustart noch stillsteht?
Hütte hat geschrieben:
29.02.2020, 21:46
Aber vielleicht liegt die Ursache auch gar nicht am Aufruf von system.Exec(): Vielleicht "spuckt" dir die Ausführung anderer CCU-Programme über ProgramExecute() in die Suppe. Vielleicht wäre es geschickter, dass das jeweilige Programm eine SV mit einem bestimmten Wert setzt und das nächste Programm durch diese SV getriggert wird statt direkt aufgerufen zu werden.
Eben deswegen stellt sich die Frage, wie ich den Übeltäter zweifelsfrei identifizieren kann (vorstehende Nachfrage #2)
Hütte hat geschrieben:
29.02.2020, 21:46
Mach mal in deinem ersten Programm aus dem "Sonst"-Zweig einen "Sonst-Wenn"-Zweig, bei dem du sowohl den Boot-Zustand als prüfst und den TFK als Trigger ("geschlossen" und bei "Änderung auslösen" benutzt), um deine SV zu setzen.
Meinst Du so? Scheint zu funktionieren, mein Hirn hat allerdings ein Verständnisproblem mit EssZi Fenster bei geschlossen bei Änderung auslösen. (Heisst das übersetzt, wenn es sich von offen zu geschlossen ändert?)
Bildschirmfoto 2020-03-03 um 04.15.21.png

Gerti
Beiträge: 1524
Registriert: 28.01.2016, 18:06
Hat sich bedankt: 6 Mal
Danksagung erhalten: 41 Mal

Re: system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von Gerti » 03.03.2020, 07:42

Hi!

Die ganze Programmierung ist irgendwie von hinten durch die Brust ins Auge.
Wenn ich eine Meldung nach Zeit bekommen will, dann setze ich beim Öffnen des Fensters zeitverzögert eine Variable und wenn es geschlossen wird, setze ich diese zurück.
In einem weiteren Programm triggere ich dann auf diese Variable und setze dann die Pushnachricht ab.
Aber mehrere abhängige Skripte und durch Programme gestartete Programme um eine Pushnachricht zu versenden halte ich für ziemlich umständlich und unnötig.

Gruß
Gerti

Hütte
Beiträge: 409
Registriert: 08.02.2017, 11:08
Hat sich bedankt: 9 Mal
Danksagung erhalten: 30 Mal

Re: system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von Hütte » 03.03.2020, 17:34

Wookbert hat geschrieben:
03.03.2020, 04:23
Ich weiß nicht, ob es aufgefallen ist, aber ich leider waren die oben abgebildeten Programm-Screenshots zunächst durcheinander/in falscher Reihenfolge. Jetzt korrigiert.

....

Meinst Du so? Scheint zu funktionieren, mein Hirn hat allerdings ein Verständnisproblem mit EssZi Fenster bei geschlossen bei Änderung auslösen. (Heisst das übersetzt, wenn es sich von offen zu geschlossen ändert?)

....
Ja. Das mit den Screenshots war mir aufgefallen, aber ich hatte sie ja in deinem anderen Beitrag gesehen. Aber kann ja mal passieren. :wink:
Ja. Genau so hatte ich es mit dem Anlegen des Sonst-Wenn-Zweiges gemeint
Ja. Genau das ist auch mit der Abfrage gemeint. Wenn der Status des TFK sich von "offen" auf "geschlossen" ändert, dann ist das der Trigger für diesen Zweig des Programmes.

Hütte
Beiträge: 409
Registriert: 08.02.2017, 11:08
Hat sich bedankt: 9 Mal
Danksagung erhalten: 30 Mal

Re: system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von Hütte » 03.03.2020, 17:40

Gerti hat geschrieben:
03.03.2020, 07:42
Hi!

Die ganze Programmierung ist irgendwie von hinten durch die Brust ins Auge.
Wenn ich eine Meldung nach Zeit bekommen will, dann setze ich beim Öffnen des Fensters zeitverzögert eine Variable und wenn es geschlossen wird, setze ich diese zurück.
In einem weiteren Programm triggere ich dann auf diese Variable und setze dann die Pushnachricht ab.
Aber mehrere abhängige Skripte und durch Programme gestartete Programme um eine Pushnachricht zu versenden halte ich für ziemlich umständlich und unnötig.

Gruß
Gerti
Das ist aber nicht die Absicht gewesen. Die Absicht ist, dass mehrere Nachrichten in gewissen Zeitabständen per Telegramm an mehrere Personen verschickt werden. Und wenn sich dann z.B. das "Problem" des offenen Fensters nach der zweiten Nachricht, aber vor der 3 Nachricht, gelöst wurde, weil sich endlich jemand bequemt hat und das Fenster geschlossen hat, dann soll bei allen Personen die Telegrammeldung automatisch vom Handy gelöscht werden. Das ist der Unteschied zum nur "einfachen" Versenden der Nachrichten.

Gerti
Beiträge: 1524
Registriert: 28.01.2016, 18:06
Hat sich bedankt: 6 Mal
Danksagung erhalten: 41 Mal

Re: system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von Gerti » 03.03.2020, 17:45

Hi!

Aber auch das kann man so lösen, wie ich geschrieben habe.

Gruß
Gerti

Hütte
Beiträge: 409
Registriert: 08.02.2017, 11:08
Hat sich bedankt: 9 Mal
Danksagung erhalten: 30 Mal

Re: system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von Hütte » 03.03.2020, 17:55

Ja. Aber so wie es aussieht, hat der TE sich hier einer fertigen Lösung, die ein "Dr. Woo" vorgestellt hat, übernommen und dann noch eine Idee übernommen, wie man die Nachrichten wieder löschen kann. Nur bei der finalen Umsetzung hat es dann etwas gehapert.

Aber ich gebe dir vollkommen Recht, dass es sinnvoller ist, so etwas über SV zu steuern, auch und gerade Aktoren. Denn dann kann ich eine SV über mehrere Programme mehrmals mit denselben Wert füllen, ohne dass das zugehörige Programm, dass auf eine Änderung der SV "lauscht", mehrmals zu triggern. Das sorgt dann auch für weniger Funkverkehr.

Wookbert
Beiträge: 195
Registriert: 10.05.2013, 18:40
Hat sich bedankt: 1 Mal

Re: system.Exec: Meiden oder nicht? – Sämtliche Programme sind tot!

Beitrag von Wookbert » 03.03.2020, 20:03

Der TE „Wookbert“ und Script-Autor „Dr. Woo“ sind ein und die selbe Person, meine Wenigkeit. Ich bin relativ unerfahren in Sachen Programmierung, deswegen muss ich mir die Sachen zusammenklauben, und mich per Trial & Error rantasten. Der Telegram-Pusher-Teil basiert Christian Lütgens’ Telegram-Framework-Homematic-Anleitung und funktioniert einwandfrei.

Mein Ziel der vielen Programmteile ist/war, daß ich die langen Skripte nicht mehrfach in jedem Programm für jedes Fenster wiederhole, sondern globale Programmteile habe, die ich im Änderungsfall nur an einer Stelle anfassen und ändern muss, statt bei 12 Fenstern, wobei sich vermutlich Fehler einschleichen würden.
Hütte hat geschrieben:
03.03.2020, 17:55
Aber ich gebe dir vollkommen Recht, dass es sinnvoller ist, so etwas über SV zu steuern, auch und gerade Aktoren. Denn dann kann ich eine SV über mehrere Programme mehrmals mit denselben Wert füllen, ohne dass das zugehörige Programm, dass auf eine Änderung der SV "lauscht", mehrmals zu triggern. Das sorgt dann auch für weniger Funkverkehr.
Ich kann dieser Aussage leider gerade gar nicht folgen, würde es aber gerne. Könntest Du es anhand meiner Anwendung für Dumme erklären? Welchen Programmteil meinst Du da genau?

Antworten

Zurück zu „RaspberryMatic“