Hi,
ich liebe ja automatisch Update. Die neue Version erzeugt zu meiner Freude eine Variable wenn ein entsprechendes Payload kommt. Heute habe ich gesehen das darunter auch ein String ‚Update‘ mit einer json Struktur ist.
Ich habe mein automatisches Update-Script an die neue Version angepasst. Beim ersten Aufruf analysiert es die Update-Strings, wenn vorhanden, und legt die Variable Update Status an. In diese Status Variable kommt dann „idle“ oder „available“. Bei letzteren wird Z2M_PerformOTAUpdate mit der InstanzID aufgerufen. Es wird ein Trigger auf Verbindungsqualität der ID aktiviert und darin wird dann der Fortschritt angezeigt.
Das Script hat bei mir auch gleich angeschlagen:
Hier das Script:
<?php
$ignoreIDs = [];
$InstanzID = @IPS_GetVariableIDByName('InstanzID', $_IPS['SELF']);
if($InstanzID === false){
$InstanzID = IPS_CreateVariable(1);
IPS_SetName($InstanzID, 'InstanzID');
IPS_SetParent($InstanzID, $_IPS['SELF']);
SetValue($InstanzID, 0);
}
$TriggerID = @IPS_GetVariableIDByName('TriggerID', $_IPS['SELF']);
if($TriggerID === false){
$TriggerID = IPS_CreateVariable(1);
IPS_SetName($TriggerID, 'TriggerID');
IPS_SetParent($TriggerID, $_IPS['SELF']);
SetValue($TriggerID, 0);
}
$Instanz = GetValue($InstanzID);
switch ($_IPS['SENDER']){
case "Variable":
$DeviceConfig = json_decode(IPS_GetConfiguration($Instanz), true);
$DeviceBaseTopic = $DeviceConfig["MQTTBaseTopic"];
$BridgeIDsList = IPS_GetInstanceListByModuleID('{00160D82-9E2F-D1BD-6D0B-952F945332C5}'); // Zigbee2MQTT
$BridgeID = 0;
foreach ($BridgeIDsList as $BridgeIDItem){
$BridgeConfig = json_decode(IPS_GetConfiguration($BridgeIDItem), true);
$BridgeBaseTopic = $BridgeConfig["MQTTBaseTopic"];
if ($DeviceBaseTopic == $BridgeBaseTopic){
$BridgeID = $BridgeIDItem;
break;
}
}
if ($BridgeID === 0) return;
$VarID = @IPS_GetObjectIDByIdent('update', $Instanz);
$Var = json_decode(GetValue($VarID), true);
if (isset($Var['state'])){
if ($Var['state'] == 'available'){
$config = json_decode(IPS_GetConfiguration($Instanz), true);
Z2M_PerformOTAUpdate($BridgeID, $config["MQTTTopic"]);
}
$VarID = @IPS_GetObjectIDByIdent('update_status', $Instanz);
if ($VarID != 0){
$Text = $Var['state'];
if (isset($Var['progress'])){
$Text .= ' : ' . $Var['progress'] . '%';
}
SetValue($VarID, $Text);
}
if ($Var['state'] == 'idle'){
IPS_LogMessage("Update Ende", IPS_GetName($Instanz));
$Trigger = GetValue($TriggerID);
IPS_SetEventActive($Trigger, false);
SetValue($InstanzID, 0);
IPS_SetScriptTimer($_IPS['SELF'], 120);
}
}
break;
case "Execute":
case "TimerEvent":
// Alle Zigbee2MQTT Instanzen in ein Feld einlesen
$InstanzIDsList = IPS_GetInstanceListByModuleID('{E5BB36C6-A70B-EB23-3716-9151A09AC8A2}'); // Zigbee2MQTT
// alle Z2M Instanzen untersuchen
foreach ($InstanzIDsList as $Instanz) {
if (in_array($Instanz, $ignoreIDs)) {
continue;
}
// Gibt es Status-Variable
//{"installed_version":1107324829,"latest_version":1124102917,"state":"available"}
$VarID = @IPS_GetObjectIDByIdent('update', $Instanz);
if ($VarID > 0){
$Update = json_decode(GetValue($VarID), true);
if (isset($Update['state'])){
$VarID = @IPS_GetObjectIDByIdent('update_status', $Instanz);
if ($VarID == 0){
$VarID = IPS_CreateVariable(1);
IPS_SetName($VarID, 'Update Status');
IPS_SetIdent($VarID, 'update_status');
IPS_SetParent($VarID, $_IPS['SELF']);
}
SetValue($VarID, $Update['state']);
}
}
}
foreach ($InstanzIDsList as $Instanz) {
if (in_array($Instanz, $ignoreIDs)) {
continue;
}
$VarID = @IPS_GetObjectIDByIdent('update_status', $Instanz);
if ($VarID != 0){
if (GetValue($VarID) == 'available'){
IPS_LogMessage("Update Start", IPS_GetName($Instanz));
IPS_SetScriptTimer($_IPS['SELF'], 0);
SetValue($InstanzID, $Instanz);
$Trigger = GetValue($TriggerID);
if ($Trigger == 0){
$Trigger = IPS_CreateEvent(0);
IPS_SetParent($Trigger, $_IPS['SELF']);
IPS_SetEventAction($Trigger, "{7938A5A2-0981-5FE0-BE6C-8AA610D654EB}",[]);
IPS_SetEventActive($Trigger, false);
SetValue($TriggerID, $Trigger);
}
$VarID = @IPS_GetObjectIDByIdent('linkquality', $Instanz);
IPS_SetEventTrigger($Trigger, 0, $VarID);
IPS_SetEventActive($Trigger, true);
return;
}
}
}
IPS_SetScriptTimer($_IPS['SELF'], 7 * 24 * 3600);
break;
}
?>
Einfach einmal aufrufen und danach wird einmal in der Woche nach Updates gesucht und wenn vorhanden gestartet.
Ralf