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

----------
Es ist mir egal, wer Dein Vater ist.
Solange ich hier angele, läufst Du hier nicht übers Wasser!
----------

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)
----------
Es ist mir egal, wer Dein Vater ist.
Solange ich hier angele, läufst Du hier nicht übers Wasser!
----------

tschimi

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