Hallo.
Ich setze viele Shellies ein, teilweise mit Original Firmware, mit und ohne Cloud, teilweise mit Tasmota. Ich habe Erfahrung mit Tasmota32 und Berry auf einem ESP32 Board (kein Shelly). Davon bin ich begeistert.
Meine neuen Shelly der zweiten Generation statte ich gerne mit Scripts (Shelly Script, mJS subset) aus. Derzeit kämpfe ich mit einem Shelly Pro 2 und dem Scripting.
Ich habe drei Scripts erstellt, die virtuelle Geräte (VD=virtual device) implementieren. Diese VD kommunizieren per MQTT miteinander. Da der Pro 2 zwei Schaltausgänge besitzt, habe ich in jedem der drei Scripts eine entsprechende Struktur aus Objekten erstellt. Ein Objekt dient als Prototyp für eine Liste (Array) aus Objekten dieses Prototyps. Das Eventhandling habe ich weitgehend im Griff.
In der Doku zum Scripting vermisse ich Hinweise zum Garbage Collector, welcher vermutlich arbeitet, was aber auf der Scripting Ebene nicht feststellbar ist. mJS beschreibt eine Funktion gc().
Nun zu meinem Problem:
Die Scripte arbeiten sehr gut zusammen.
Hin und wieder erscheint eine Fehlermeldung "Subscription callback error: implicit type conversion is prohibited".
Diese Fehlermeldung ist irreführend. Sie verweist auf folgenden Codeabschnitt:
let Circuits = 2; // Tatsächlich lasse ich diese Anzahl per hässlichem aber funktionstüchtigem Workaround ermitteln.
let C0 = '0'.charCodeAt(0);
function getId(topic) {
let i = topic.charCodeAt(topic.length-1) - C0;
//let i = JSON.parse(topic.slice(topic.length-1));
let max = Circuits - 1 ;
return i<0 ? 0 : (i>max ? max : i);
}
Die Fehlermeldung verweist auf die erste Zeile in der Funktion getId(), Zeile 5. Zeile 6 ist ein Workaround-Versuch. Das importierte MQTT Topic beinhaltet am Ende die Id, hier '0' oder '1'. Es ist fehlerfrei. Eine implizite Typkonvertierung findet nicht statt bzw. ist nicht von mir codiert, entgegen des Inhalts der Fehlermeldung. Die Fehlermeldung erscheint bei ca. jeder dritten Abarbeitung eines eintreffenden Ereignisses, nicht reproduzierbar und in der Dichte nicht verlässlich.
Diese Funktion setze ich in allen drei Scripten (VD) ein. Die Fehlermeldung kann auch auf die entsprechende Stelle in einem anderen Script hinweisen. Sonstige Laufzeitfehler ereignen sich nicht mehr. Ich bin gerne bereit, ein oder alle drei Scripte zur Verfügung zu stellen. Es ist aber sehr unwahrscheinlich, dass dort ein Codefehler zu finden ist. Ich habe lange daran gearbeitet und sehr viele Tests durchgeführt. Auch habe ich aus Verzweiflung temporär alle MQTT retains abgestellt, ohne Erfolg.
Ich vermute das Problem irgendwo im Inneren der Firmware - mongoose OS oder JS Interpreter oder Speichernutzung (Stack vielleicht).
Bedauerlicherweise kann ich meine neuen Shelly Pro 2 so nicht wie gewünscht einsetzen.
Die Doku zu Shelly Script ist einigermaßen zu gebrauchen, wenn man bereit ist, sich durchzuexperimentieren. Ich nutze u.a. einen Raspberry Pi 4 mit Mosquitto und Node-RED.
Meine VD Scripte habe ich in deren Anwendung beschrieben auf deutsch und auf english. Mein english ist eingeschränkt, ich komme aber zurecht.
Ausnahmsweise weiß ich mir bei diesem merkwürdigen Verhalten nach etlichen Tagen des Experimentierens und Protokollierens nicht mehr zu helfen.
Hinweis zu den beiden Links. Die Links können statt direkt zu den Artikeln nur zu meiner Website führen. Dort sind beide Artikel dann unter 'Projekte' zu finden - Generation 2 ...