Ich musste soeben feststellen, dass mein letztes Skript wegen zu vieler RPC Aufrufe abgebrochen wurde - nach geschätzt 10h Laufzeit des Skripts. Deshalb werde ich das Zeitmanagement auf Schedule Jobs stützen, ergänzt durch Skript interne Timer. Das Prinzip habe ich an anderer Stelle beschrieben:
https://iotig.eichelsdoerfer.net/index.php/anwe…iden-reduzieren
Hierzu will ich mindestens eine flexibel nutzbare Datenstruktur kreieren, was mehr "Gripsarbeit" und Recherche/Experimente erfordert.
Ziele und Planungen - hier zwecks Verständlichkeit zusammengefasst
- Ein Skriptabbruch darf sich nicht ereignen. Die größte Gefahr geht vom Limit 5 parallel ausgeführter RPC aus. Dieses Limit sollten die Shelly Firmware Entwickler wegen leistungsfähigerer Shelly neuerer Generationen erhöhen. Ich muss aber dieses Limit bis auf weiteres berücksichtigen.
- Warn- und Notsignale sollen hier keine Rolle spielen, da solche am besten kabelgebunden zuzuführen und skriptunabhängig bspw. per Aktion oder gar durch zusätzliche Schaltungen zu verarbeiten sind.
- Folgende Kategorien von Nachrichten sind zweckmäßig/vorzusehen.
- Sofort auszuführende Nachrichten, bspw. auf Grund von Tastendrücken oder Bewegungsmeldungen - Mensch Maschinen Schnittstelle, Usability.
Deren Anzahl ist stark einzuschränken, da gleichzeitiges Eintreffen mit erforderlichen RPC Methoden schnell zur Überschreitung des RPC Limits führen können. Solche Nachrichten treffen aus Perspektive des Skripts zufällig ein. - Verzögert zu verarbeitende Nachrichten, bspw. Messwerte. Deren Verarbeitung kann leicht in Sekundenabständen erfolgen, evtl. sogar noch stärker verzögert.
- Unmittelbare Nachrichten von per Components registrierten/gekoppelten BLU Geräten.
- Mittelbare Nachrichten, die von anderen nicht BLU Geräten kommen und deren Daten vor der Verarbeitung noch abzufragen sind (zusätzliche RPC erforderlich).
- Sofort auszuführende Nachrichten, bspw. auf Grund von Tastendrücken oder Bewegungsmeldungen - Mensch Maschinen Schnittstelle, Usability.
- Das Zeitmanagement für Nachrichten der Kategorie 3.2 - und damit Kat. 3.4 sowie mancher von Kat. 3.3 (s.u.) - ist ausschließlich per Schedule Job(s) zu implementieren, weil deren Verarbeitungsstarts deterministisch sind, d.h. innerhalb von Zeitperioden (bspw. 1 Minute) festgelegt.
- Zwecks Validierung der Funktionssicherheit sind periodisch Skriptstarts per Schedule Job vorzusehen, bspw. alle 10 Minuten. Mit jedem Neustart ist im Skript der aktuelle Zeitstempel zu generieren, möglichst die Ursache für einen vorangehenden Skriptabbruch zu ermitteln und beides in einer separaten, nicht ausführbaren Skriptdatei abzulegen. Damit sind im nachhinein Skriptabbrüche und deren Ursache erkenn- und in Grenzen analysierbar. Dies wird afaik durch Wirkungslosigkeit eines Skriptstarts bei bereits laufendem Skript unterstützt.
Nachrichten der Kategorie 3.3 können entweder zur Kategorie 3.1 oder 3.2 gehören.
Nachrichten der Kat. 3.4 gehören immer zur Kat. 3.2.
In Mengenausdrucksweise:
Kategorien 3.1 und 3.2 sind elementfremd, d.h. deren Schnittmenge ist leer.
Elemente (=Nachrichten) der Kategorie 3.3 sind entweder auch Elemente von Kategorie 3.1 oder von Kat. 3.2.
Elemente von Kategorie 3.4 sind immer auch Elemente von Kat. 3.2, d.h. Kat. 3.4 ist Teilmenge von Kat. 3.2.
Diese Dinge sind notwendig für eine robuste Implementation von Datenstrukturen, welche grundlegend für eine hohe Ausfallsicherheit in der Skriptabarbeitung sind.
Wann ich das Skript hier vorstellen werde, weiß ich noch nicht. Mit dieser Planung ist aber der kreative Anfang gemacht, der Rest ist Fleißarbeit.