Ich habe auf einem i4 ein Script laufen das im Normalfall auch immer funktioniert.
Ab und an steht das Script auf Stop und nach einem erneuten Start per Weboberfläche läuft es wieder.
Das Script steht auch auf Autostart und sollte bei Spannungsausfall eigentlich auch sofort wieder laufen (nach Test macht es das auch).
Ich vermute das der MQTT-Server ab und an nicht erreichbar ist (Warum auch immer er ist Intern im ioBroker).
Das sind aber nur Vermutungen und ich finde den Fehler nicht.
Hier das Script das Tastendrücke auf den Eingängen Zählt, diese an den MQTT weiter gibt und der Zähler kann vom MQTT beeinflusst werden.
// Script für den SHELLY i4 Taster-Anschluss
// Tastendruck SW1-SW4 auswerten 0-2 und diese dem MQTT übergeben
// Zählerbeeinflussung vom MQTT den Tastenzählern zuweisen
// --------------------------------------------------------------
//Variabeln deffinieren
let CONFIG = {
device_id: "",
device_mac: "",
device_model: "",
fw_ver: "",
topic_prefix: "",
wifi_ip: "",
};
let Taste = [0,0,0,0]; //Tate SW1 - SW4
let T_Name = ["Nr:1","Nr:2","Nr:3","Nr:4"]; //Name der Taste im MQTT
function isConfigReady() {
for (let key in CONFIG) {
if (CONFIG[key] === "") return false;
}
return true;
}
Shelly.call("Shelly.GetDeviceInfo", null, function (info) {
CONFIG.device_id = info.id;
CONFIG.device_mac = info.mac;
CONFIG.device_model = info.model;
CONFIG.fw_ver = info.fw_id;
});
//Read ip from status
Shelly.call("WiFi.GetStatus", null, function (status) {
if (status.status === "got ip") {
CONFIG.wifi_ip = status.sta_ip;
}
});
//Monitor ip changes
Shelly.addStatusHandler(function (status) {
if (status.component === "wifi" && status.delta.status === "got ip") {
CONFIG.wifi_ip = status.delta.sta_ip;
}
});
//Read mqtt topic prefix
Shelly.call("MQTT.GetConfig", null, function (config) {
CONFIG.topic_prefix = config.topic_prefix;
});
// Eingänge abfragen und Tastendruck von 0 - 2 zählen
Shelly.addEventHandler
(
function (event)
// Event aktivieren
{
if(event.name==="input" && event.info.state === true)
{
let id = event.info.id; //id = Welcher Eingang
if (id > -1 && id < 4) //SW1 - SW3
{
Taste[id] = Taste[id] + 1;
if (Taste[id] === 3)
{
Taste[id] = 0;
}
//print(deviceInfo.id,"/Taste/",T_Name[id],JSON.stringify(Taste[id]));
MQTT.publish(CONFIG.topic_prefix + "/Taste/"+T_Name[id], JSON.stringify(Taste[id]));
}
}
}
)
// Announcen die MQTT ankommen bearbeiten
function announceHandler(topic, message)
{
let kanal = 0;
print("topic = ",topic," message = ",message);
kanal = JSON.parse(topic.slice(topic.length - 1,topic.length)) -1;
if (message !== "0" && message !== "1" && message !== "2") return;
Taste[kanal] = JSON.parse(message);
MQTT.publish(CONFIG.topic_prefix + "/Taste/"+T_Name[kanal], message);
}
// Announcen im MQTT anmelden
function subscribeToTopics()
{
MQTT.subscribe(CONFIG.topic_prefix + "/Taste/command_Nr_1", announceHandler);
MQTT.subscribe(CONFIG.topic_prefix + "/Taste/command_Nr_2", announceHandler);
MQTT.subscribe(CONFIG.topic_prefix + "/Taste/command_Nr_3", announceHandler);
MQTT.subscribe(CONFIG.topic_prefix + "/Taste/command_Nr_4", announceHandler);
}
//Start a timer that checks if all fields in CONFIG are populated
let configReadyTimer;
function connectToMQTT() {
configReadyTimer = Timer.set(3000, true, function () {
if (!isConfigReady()) return;
if (!MQTT.isConnected()) return;
subscribeToTopics();
Timer.clear(configReadyTimer);
});
}
connectToMQTT();
MQTT.setDisconnectHandler(function () {
connectToMQTT();
});
Alles anzeigen
Könnt Ihr Euch das bitte mal ansehen und Möglicherweise findet Ihr da Verbesserungen so das das Script nicht auf Stop geht.
Sonst kontrolliere ich das per Blockly ob es läuft und starte es auf dem Wege wieder Neu.
Das ist aber eigentlich nur eine Übergangslösung und keine Problemlösung.
mfg
f.b.