Automatisches Update von Shelly Steckdosen

Begonnen von tschimi, 11 November 2021, 12:31:59

Vorheriges Thema - Nächstes Thema

tschimi

Hi,
hat mich genervt, das ich regelmäßig 15 Steckdosen manuell updaten muss. Hier mal mein Codeschnippselchen ;-)
Das HTTP-Commando ist: http://user:passwort@<ip>/ota?update=true
Und ohne Passwort: http://<ip>/ota?update=true

Einfach in die 99_myUtils.pm und dann z.b. so in Fhem aufrufen (Ruft den Check alle Stunde auf, ggf. anpassen):

define checkShellyUpdates at +*00:01:00 {ShellyUpdateCheck()}

Lg, tschimi


sub ShellyUpdateCheck() {
  my $upd = "";
  my $cmd = "";
  my $ip  = "";
  foreach my $monitored (devspec2array("TYPE=Shelly")) {
if (index(ReadingsVal($monitored,"firmware",""),"update") ne -1) {
$ip  = InternalVal($monitored,"TCPIP","");
$upd = "{GetFileFromURL('http://user:passwort@".$ip."/ota?update=true')}";
fhem($upd);
}
  }
  $cmd = "set shellyUPDATE ".$ip." ";
  if ($ip eq "") { fhem("set shellyUPDATE Kein Update notwendig");} else { fhem($cmd); }
  return $cmd;
}





betateilchen

sowas ähnliches mache ich mit meinen Tasmota Steckdosen


#!/bin/bash
clear
for ip in {70..83}
do
  wget -T 20 -o /dev/null -O /dev/null http://192.168.123.$ip/u1?o=http%3A%2F%2F192.168.123.241%3A8082%2Ftasmota-lite.bin.gz
  sleep 60
done


Damit werden alle 14 vorhandenen Steckdosen hintereinander mit einem update versorgt. Allerdings starte ich das nur dann, wenn ich wirklich weiß, dass es ein neues Tasmota release gab.

Als lokalen "Webserver" für das update-file benutze ich ein minimales python script:


#!/bin/sh
python -m SimpleHTTPServer 8082

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zwei der drei Zeilen verstehe ich nicht


$ip  = InternalVal($monitored,"TCPIP","");
$upd = "{GetFileFromURL('http://user:passwort@".$ip."/ota?update=true')}";
fhem($upd);


Du baust in der zweiten Zeile einen perl code zusammen, den Du dann an eine FHEM Funktion übergibt, die das interpretiert und wieder perl draus macht, um es auszuführen? Warum?


$ip  = InternalVal($monitored,"TCPIP","");
GetFileFromURL("http://user:passwort@".$ip."/ota?update=true");


sollte genausogut funktionieren (ich habe die Anführungszeichen mal etwas verändert)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

tschimi

Dankeschön für den Hint ;-) Dann kann ich mir noch ne Variable sparen ;-)