Plugwise Stretch 2.0 – Firmware update (handmatig)
Ik kreeg onlangs een mailtje dat mijn PWScli programma niet meer werkt, er bleken gebruikers van de stretch te zijn die al op firmware 2.0.x zaten terwijl ik nog op 1.0.41 zat, ik vind het dan vreemd waarom wij niet allemaal zo een update gekregen hadden!
https://securedownloads.plugwise.com/tools/apps/plugwise_desktop_1.6.7.exe
drukte op de update button, maar er gebeurde niets, ook niet met de v1.6.4 Android app.
Wat heb je nodig?
Eerst moeten we erachter zien te koment hoe het update process werkt, daarvoor heb ik de plugwise desktop v1.6.7 met de actionscript extractor uitelkaar geplukt, toen viel mijn oog op dit stukje code:
-
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849public function downloadFirmware(param1:Host = null) : void{if(param1 == null){param1 = this.smile;}if(!param1.connected){trace("SmileModel downloadFirmware NO HOST CONNECTION");return;}var _loc_4:getString = resourceManager.getString("resources", "Downloading_firmware_update_for_the_Smile...");this.activityText = _loc_4;this.errorText = _loc_4;this.plugwiseService.headers = {AUTHORIZATION:param1.basicAuthorizationString(), x-connection-override:"close"};this.plugwiseService.url = param1.hostURL(param1.port, "update/firmware");this.plugwiseService.resultFormat = "e4x";this.plugwiseService.contentType = "application/xml";this.plugwiseService.method = "POST";this.plugwiseService.requestTimeout = 0;var _loc_2:XML = new XML("<upgrade>\r\n\t\t\t\t\t\t\t\t\t\t<state>downloading</state>\r\n\t\t\t\t\t\t\t\t\t</upgrade>");var _loc_3:AsyncToken = sendHttpService(this.plugwiseService, _loc_2);_loc_3.action = "downloadFirmware";}public function installFirmware(param1:Host = null) : void{if(param1 == null){param1 = this.smile;}if(!param1.connected){trace("SmileModel installFirmware NO HOST CONNECTION");return;}var _loc_4:getString = resourceManager.getString("resources", "Installing_firmware_update_for_the_Smile...");this.activityText = _loc_4;this.errorText = _loc_4;this.plugwiseService.headers = {AUTHORIZATION:param1.basicAuthorizationString(), x-connection-override:"close"};this.plugwiseService.url = param1.hostURL(param1.port, "update/firmware");this.plugwiseService.resultFormat = "e4x";this.plugwiseService.contentType = "application/xml";this.plugwiseService.method = "POST";this.plugwiseService.requestTimeout = 0;var _loc_2:XML = new XML("<upgrade>\r\n\t\t\t\t\t\t\t\t\t\t<state>installing</state>\r\n\t\t\t\t\t\t\t\t\t</upgrade>");var _loc_3:AsyncToken = sendHttpService(this.plugwiseService, _loc_2);_loc_3.action = "installFirmware";}
Laten we even kijken naar deze pagina op de stretch (v1.0.x): http://192.168.x.x/update/firmware, het resultaat:
Zo te zien aan het stukje code uit de plugwise desktop moeten we een POST commando doen naar http://192.168.x.x/update/firmware en moeten de “STATE” zetten in “DOWNLOADING”.
Ik had een voorbeeldscript geschreven voor de Smile, dat heb ik iets aangepast zodat het nu is geworden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
; Stretch 2.0 setup Global $StretchIp = "192.168.1.101" ;The IP adres of the Stretch 2.0, like: 192.168.1.X Global $StretchId = "abcdfghj" ;The 8 letters of the Stretch 2.0 ID ; Kernel Global $PostAdres = "http://" & $StretchIp & "/update/firmware" Global $PostGegevens = "<upgrade>\r\n\t\t\t\t\t\t\t\t\t\t<state>downloading</state>\r\n\t\t\t\t\t\t\t\t\t</upgrade>" $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") $oHTTP.Open("POST", $PostAdres, False) $oHTTP.SetRequestHeader("Connection", "Close") $oHTTP.SetRequestHeader("Content-Type", "application/xml") $oHTTP.SetRequestHeader("Host", $StretchIp) $oHTTP.SetRequestHeader("Authorization", "Basic " & _Base64Encode("stretch:" & $StretchId)) $oHTTP.Send(Linux2WinString($PostGegevens)) Global $PostResponse = $oHTTP.ResponseText If $oHTTP.Status <> "200" Then MsgBox(64, "Error", $PostResponse) Else MsgBox(64, "Done!", $PostResponse) EndIf Exit Func _Base64Encode($sData) Local $oXml = ObjCreate("Msxml2.DOMDocument") If Not IsObj($oXml) Then SetError(1, 1, 0) EndIf Local $oElement = $oXml.createElement("b64") If Not IsObj($oElement) Then SetError(2, 2, 0) EndIf $oElement.dataType = "bin.base64" $oElement.nodeTypedValue = Binary($sData) Local $sReturn = $oElement.Text If StringLen($sReturn) = 0 Then SetError(3, 3, 0) EndIf Return $sReturn EndFunc Func Linux2WinString($data) $data = StringReplace($data, "\r", @CR) ; \r carriage return $data = StringReplace($data, "\n", @CRLF) ; \n new line $data = StringReplace($data, "\t", @TAB) ; \t horizontal tab Return $data EndFunc |
Het script zal een “OK” melden als het gelukt is
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
; Stretch 2.0 setup Global $StretchIp = "192.168.1.101" ;The IP adres of the Stretch 2.0, like: 192.168.1.X Global $StretchId = "abcdfghj" ;The 8 letters of the Stretch 2.0 ID ; Kernel Global $PostAdres = "http://" & $StretchIp & "/update/firmware" Global $PostGegevens = "<upgrade>\r\n\t\t\t\t\t\t\t\t\t\t<state>installing</state>\r\n\t\t\t\t\t\t\t\t\t</upgrade>" $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") $oHTTP.Open("POST", $PostAdres, False) $oHTTP.SetRequestHeader("Connection", "Close") $oHTTP.SetRequestHeader("Content-Type", "application/xml") $oHTTP.SetRequestHeader("Host", $StretchIp) $oHTTP.SetRequestHeader("Authorization", "Basic " & _Base64Encode("stretch:" & $StretchId)) $oHTTP.Send(Linux2WinString($PostGegevens)) Global $PostResponse = $oHTTP.ResponseText If $oHTTP.Status <> "200" Then MsgBox(64, "Error", $PostResponse) Else MsgBox(64, "Done!", $PostResponse) EndIf Exit Func _Base64Encode($sData) Local $oXml = ObjCreate("Msxml2.DOMDocument") If Not IsObj($oXml) Then SetError(1, 1, 0) EndIf Local $oElement = $oXml.createElement("b64") If Not IsObj($oElement) Then SetError(2, 2, 0) EndIf $oElement.dataType = "bin.base64" $oElement.nodeTypedValue = Binary($sData) Local $sReturn = $oElement.Text If StringLen($sReturn) = 0 Then SetError(3, 3, 0) EndIf Return $sReturn EndFunc Func Linux2WinString($data) $data = StringReplace($data, "\r", @CR) ; \r carriage return $data = StringReplace($data, "\n", @CRLF) ; \n new line $data = StringReplace($data, "\t", @TAB) ; \t horizontal tab Return $data EndFunc |
Het script zal een “OK” melden als het gelukt is
Zo ziet de nieuwe v2.0.x firmware van de stretch er uit:
Ps. De “website” van de stretch werkt niet in IE9 (en IE10?) maar kan wel benaderd worden met Google Chrome, Firefox, Safari
Updaten via SSH
1) Hiervoor heb je wel een SSH verbinding voor nodig bijvoorbeeld met Putty
2) Autoit3 software
Het kan zijn dat er geen firmware meer klaarstaat om te installeren, zoals bijvoorbeeld bij v1.0.46, de XML op http://192.168.x.x/update/firmware ziet er dan zo uit:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="ISO-8859-1"?> <update> <firmware> <current> <version>1.0.46</version> </current> <upgrade> <state>no_upgrade</state> </upgrade> </firmware> </update> |
De gegevens uit deze XML staan op de stretch 2.0 in het configuratiebestand: /etc/config/smile
Ps. de smile is een ander product, maar ze hebben hetzelfde configuratiebestand!
een stukje uit: cat /etc/config/smile
1 2 3 4 |
config firmware 'firmware' option version '1.0.46' option type 'stretch-home' option upgrade_base_url 'https://update.plugwise.net/' |
Het comanndo uci show smile.firmware geeft dan:
1 2 3 4 |
smile.firmware=firmware smile.firmware.version=1.0.46 smile.firmware.type=stretch-home smile.firmware.upgrade_base_url=https://update.plugwise.net/ |
We moeten dus wat “regels” opnieuw instellen, dit zijn de gegevens van de 1.0.38 firmware:
1 2 3 4 5 6 7 8 |
config firmware 'firmware' option version '1.0.38' option type 'stretch-home' option upgrade_base_url 'https://update.plugwise.net/' option upgrade_version '1.0.41' option upgrade_src 'https://update.plugwise.net/images/stretch-home/1.0.41.img' option upgrade_description 'Changes since 1.0.38***Removed automatic reboot at night***Added web interface for Backup and Restore' option upgrade_md5sum 'fff8f001648f30226e5aa65ecd4bd618' |
Dus de ontbrekende regels moeten we weer herstellen voor de nieuwe software, we nemen firmware v2.0.16 om te proberen, deze stellen we als volgt in met UCI:
Ps. ik heb de 2.0.16 firmware gedownload en de MD5 hash is:
1fc3f1542465a59eb5f5786be4cee3ab
1 2 3 4 |
uci set smile.firmware.upgrade_version=2.0.16 uci set smile.firmware.upgrade_src=https://update.plugwise.net/images/stretch-home/2.0.16.img uci set smile.firmware.upgrade_description=BlaBla uci set smile.firmware.upgrade_md5sum=1fc3f1542465a59eb5f5786be4cee3ab |
Even checken met het commando: uci show smile.firmware
1 2 3 4 5 6 7 8 |
smile.firmware=firmware smile.firmware.version=1.0.46 smile.firmware.type=stretch-home smile.firmware.upgrade_base_url=https://update.plugwise.net/ smile.firmware.upgrade_version=2.0.16 smile.firmware.upgrade_src=https://update.plugwise.net/images/stretch-home/2.0.16.img smile.firmware.upgrade_description=BlaBla smile.firmware.upgrade_md5sum=1fc3f1542465a59eb5f5786be4cee3ab |
Dan als laatste het commando: uci commit smile om de instellingen van kracht te doen laten komen!
Als je dan weer op http://192.168.x.x/update/firmware kijkt, dan ziet het er als volgt uit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="ISO-8859-1"?> <update> <firmware> <current> <version>1.0.46</version> </current> <upgrade> <state>published</state> <version>2.0.16</version> <src>https://update.plugwise.net/images/stretch-home/2.0.16.img</src> <md5sum>1fc3f1542465a59eb5f5786be4cee3ab</md5sum> <description>BlaBla</description> </upgrade> </firmware> </update> |
Nu kunnen we beginnen met downloaden, gebruik hiervoor het volgende Autoit3 script:
Autoit3 script om nieuwe firmware te downloaden op de Stretch 2.0 v1.0.x dat is aangekondigd in http://192.168.x.x/update/firmware
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
; Stretch 2.0 setup Global $StretchIp = "192.168.1.101" ;The IP adres of the Stretch 2.0, like: 192.168.1.X Global $StretchId = "abcdfghj" ;The 8 letters of the Stretch 2.0 ID ; Kernel Global $PostAdres = "http://" & $StretchIp & "/update/firmware" Global $PostGegevens = "<upgrade>\r\n\t\t\t\t\t\t\t\t\t\t<state>downloading</state>\r\n\t\t\t\t\t\t\t\t\t</upgrade>" $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") $oHTTP.Open("POST", $PostAdres, False) $oHTTP.SetRequestHeader("Connection", "Close") $oHTTP.SetRequestHeader("Content-Type", "application/xml") $oHTTP.SetRequestHeader("Host", $StretchIp) $oHTTP.SetRequestHeader("Authorization", "Basic " & _Base64Encode("stretch:" & $StretchId)) $oHTTP.Send(Linux2WinString($PostGegevens)) Global $PostResponse = $oHTTP.ResponseText If $oHTTP.Status <> "200" Then MsgBox(64, "Error", $PostResponse) Else MsgBox(64, "Done!", $PostResponse) EndIf Exit Func _Base64Encode($sData) Local $oXml = ObjCreate("Msxml2.DOMDocument") If Not IsObj($oXml) Then SetError(1, 1, 0) EndIf Local $oElement = $oXml.createElement("b64") If Not IsObj($oElement) Then SetError(2, 2, 0) EndIf $oElement.dataType = "bin.base64" $oElement.nodeTypedValue = Binary($sData) Local $sReturn = $oElement.Text If StringLen($sReturn) = 0 Then SetError(3, 3, 0) EndIf Return $sReturn EndFunc Func Linux2WinString($data) $data = StringReplace($data, "\r", @CR) ; \r carriage return $data = StringReplace($data, "\n", @CRLF) ; \n new line $data = StringReplace($data, "\t", @TAB) ; \t horizontal tab Return $data EndFunc |
Het script zal een “OK” melden als het gelukt is
Nu gaat de stretch de nieuwe firmware downloaden, geef de stretch 1 minuuut en kijk weer eens op http://192.168.x.x/update/firmware bij “STATE” zal dan “DOWNLOADED” vermeld staan, de firmware is nu gedownload!
Nu moeten we de firmware nog installeren, daarvoor moeten we wederom een POST commando geven op http://192.168.x.x/update/firmware en zetten we bij “STATE” “INSTALLING” neer!, hier vind je het scriptje:
Autoit3 script om nieuwe firmware te installeren op de Stretch 2.0 v1.0.x dat is aangekondigd in http://192.168.x.x/update/firmware
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
; Stretch 2.0 setup Global $StretchIp = "192.168.1.101" ;The IP adres of the Stretch 2.0, like: 192.168.1.X Global $StretchId = "abcdfghj" ;The 8 letters of the Stretch 2.0 ID ; Kernel Global $PostAdres = "http://" & $StretchIp & "/update/firmware" Global $PostGegevens = "<upgrade>\r\n\t\t\t\t\t\t\t\t\t\t<state>installing</state>\r\n\t\t\t\t\t\t\t\t\t</upgrade>" $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") $oHTTP.Open("POST", $PostAdres, False) $oHTTP.SetRequestHeader("Connection", "Close") $oHTTP.SetRequestHeader("Content-Type", "application/xml") $oHTTP.SetRequestHeader("Host", $StretchIp) $oHTTP.SetRequestHeader("Authorization", "Basic " & _Base64Encode("stretch:" & $StretchId)) $oHTTP.Send(Linux2WinString($PostGegevens)) Global $PostResponse = $oHTTP.ResponseText If $oHTTP.Status <> "200" Then MsgBox(64, "Error", $PostResponse) Else MsgBox(64, "Done!", $PostResponse) EndIf Exit Func _Base64Encode($sData) Local $oXml = ObjCreate("Msxml2.DOMDocument") If Not IsObj($oXml) Then SetError(1, 1, 0) EndIf Local $oElement = $oXml.createElement("b64") If Not IsObj($oElement) Then SetError(2, 2, 0) EndIf $oElement.dataType = "bin.base64" $oElement.nodeTypedValue = Binary($sData) Local $sReturn = $oElement.Text If StringLen($sReturn) = 0 Then SetError(3, 3, 0) EndIf Return $sReturn EndFunc Func Linux2WinString($data) $data = StringReplace($data, "\r", @CR) ; \r carriage return $data = StringReplace($data, "\n", @CRLF) ; \n new line $data = StringReplace($data, "\t", @TAB) ; \t horizontal tab Return $data EndFunc |
Het script zal een “OK” melden als het gelukt is
*** WACHT CA. 5 MINUTEN, DE FIRMWARE WORDT GEINSTALLEERD EN DE STRETCH ZAL REBOOTEN ***
*** ZET DE STRETCH NIET UIT, OF SCHAKEL DE STROOM VAN DE STRETCH NIET AF ***