Hallo,
da ich meinen Shelly's (bisher "nur" vier) ohne Internetfreigabe betreibe, habe ich nach einer Möglichkeit gesucht ein Firmwareupdate dennoch komfortabel und möglichst automatisiert durchführen zu können. Über diesen Beitrag bin ich zu folgender Lösung gekommen:
! Shelly updaten 0.0.2
! ********************************************************
string vAutoUpdate = "ja"; ! nur bei "ja" wird das Update angestossen, sonst wird nur geprüft
string vListe1 = "SHSW-25,192.168.69.50;SHSW-PM,192.168.69.51;SHRGBW2,192.168.69.52;SHEM-3,192.168.69.53"; ! Typ,IP,IP,.,.,.;Typ,IP,IP,.,.,.;Typ,
string vDateiIdSHSW_25 = "748f863308ab1516";
string vDateiIdSHSW_PM = "fefe55d73fa2d3f4";
string vDateiIdSHRGBW2 = "31b898ec5380c750";
string vDateiIdSHEM_3 = "8a415833e9a3c90a";
! ********************************************************
string stdout = "";
string stderr = "";
string vServer = "";
string vFwServer = "";
string vFwShelly = "";
string vIndex1 = "";
string vIp = "";
string vTyp = "";
string vDateiId = "";
string vName = "";
integer vZaehler1 = -1;
string vMailtext = "";
! Firmwareversionen vom Server
system.Exec("wget -q -O - -t 1 -T 10 'http://api.shelly.cloud/files/firmware'", &stdout, &stderr);
vServer = stdout.Replace("}", ",");
foreach (vIndex1, vListe1.Split(";")) {
vDateiId = "";
vZaehler1 = -1;
foreach (vIp, vIndex1.Split(",")) {
if (vDateiId == "") {
vTyp = vIp;
if (vTyp == "SHSW-25") {
vDateiId = vDateiIdSHSW_25;
} elseif (vTyp == "SHSW-PM") {
vDateiId = vDateiIdSHSW_PM;
} elseif (vTyp == "SHRGBW2") {
vDateiId = vDateiIdSHRGBW2;
} elseif (vTyp == "SHEM-3") {
vDateiId = vDateiIdSHEM_3;
} else {
vMailtext = vMailtext # "Der Shelly-typ " # vTyp # " konnte nicht zugeordnet werden.\n";
break;
}
! Firmwareversion vom Server
if (vServer.Contains('"' # vTyp # '"')) {
vFwServer = vServer.StrValueByIndex('"' # vTyp # '"', 1).StrValueByIndex('"version"', 1).StrValueByIndex(',', 0).StrValueByIndex(':', 1);
vFwServer = vFwServer.Replace("\/", "/");
} else {
vMailtext = vMailtext # "Das Auslesen der aktuellen Firmwareversion vom Server für die Shelly's vom Typ " # vTyp # " ist misslungen.\n\n";
break;
}
} else {
! Firmwareversion vom Shelly
! system.Exec("wget -q -O - -t 1 -T 10 'http://" # vIp # "/shelly'", &stdout, &stderr);
system.Exec("wget -q -O - -t 1 -T 10 'http://" # vIp # "/settings'", &stdout, &stderr);
stdout = stdout.Replace("}", ",");
if (stdout.Contains('"' # vTyp # '"')) {
vFwShelly = stdout.StrValueByIndex('"fw"', 1).StrValueByIndex(',', 0).StrValueByIndex(':', 1);
! Versionsvergleich
if (vFwShelly != vFwServer) {
vName = stdout.StrValueByIndex('"name"', 1).StrValueByIndex(',', 0).StrValueByIndex(':', 1);
vMailtext = vMailtext # "Es ist ein Firmwareupdate für den Shelly " # vName # " (" # vIp # ") verfügbar.\n";
vMailtext = vMailtext # " Version alt: " # vFwShelly # "\n Version neu: " # vFwServer # "\n\n";
! Update ausführen?
if (vAutoUpdate == "ja") {
! Datei herunterladen
if (vZaehler1 < 0) {
vTempo1 = vServer.StrValueByIndex('"' # vTyp # '"', 1).StrValueByIndex('"url"', 1).StrValueByIndex(',', 0).StrValueByIndex('"', 2);
vTempo1 = vTempo1.Replace("\/", "/");
system.Exec("wget -q -t 1 -T 10 -O /usr/local/nas/" # vTyp # ".zip " # vTempo1 # " &");
vZaehler1 = vZaehler1 + 1;
}
vTempo1 = 300 + vZaehler1 * 30;
! system.Exec("wget -q -t 1 -T 10 -O - http://" # vIp # "/ota?url=http://RasPi:Ras-Pi@192.168.69.1/fritz.nas/Fritz!Box_128/RasPi/" # vTyp # ".zip &")
! system.Exec("wget -q -t 1 -T 10 -O - http://" # vIp # "/ota?url=fritz.nas/filelink.lua?id=" # vDateiId # " &")
system.Exec("sleep " # vTempo1 # " && wget -q -t 1 -T 10 -O - http://" # vIp # "/ota?url=fritz.nas/filelink.lua?id=" # vDateiId # " &")
vMailtext = vMailtext # " Update wird in " # vTempo1 # " Sekunden ausgeführt.\n\n\n";
vTempo1 = (vTempo1 + system.Date("%s").ToInteger()).ToTime.Format("%T")
vMailtext = vMailtext # " Update wird um " # vTempo1 # " ausgeführt.\n\n\n";
}
}
} else {
vMailtext = vMailtext # "Das Auslesen der aktuellen Firmwareversion vom Shelly " # vTyp # " mit der IP " # vIp # " ist misslungen.\n\n";
}
}
}
}
! E-Mail senden
! if (vMailtext != "") {
! gvMailtext = gvMailtext # vMailtext;
! gvMailbetreff = gvMailbetreff # " " # dom.GetObject("$this$") # ",";
! dom.GetObject("Mailversand").State(true);
! }
WriteLine(vMailtext);
Alles anzeigen
Das Skript holt sich die aktuellen Firmwareversionen vom Server und vergleicht sie mit den aktuell installierten Versionen auf den in der Variable vListe1 angegebenen Shellys. In der Variable wird erst der Typ und dann Kommagetrennt die dazugehörigen IP-Adressen aller Shellys diesen Typs eingetragen. Die verschiedenen Typen werden dann durch ein Semikolon voneinander getrennt.
Ist auf einem Schelly die Firmware nicht aktuell und die Variable vAutoUpdate mit "ja" vorbelegt wird die entsprechende Firmware vom Server auf einen gemounteten Ordner meiner Fritzbox heruntergeladen. Diese Dateien habe ich vorab Freigegeben (Freigabe bleibt auch nach überschreiben der Datei erhalten) und den Code bei den Variablen vDateiIdxxxx eingetragen. Anschließend wird das Update mit einer Wartezeit von fünf Minuten (damit der Download abgeschlossen ist) angestoßen. Müssen mehrere Shellys geupdatet werden, wird jeweils nochmal 30 Sekunden zur Wartezeit addiert.
Damit das nicht nur still und heimlich passiert, lasse ich mir per Mail das Ergebnis zusenden. Den Teil habe ich hier im Skript aber auskommentiert, da es nicht ohne weiteres in einer anderen CCU lauffähig ist.
Ich wünsche allen ein Frohes und gesundes Fest