ioBroker / ioBroker.hm-rpc

Connects HomeMatic Interface-Processes to ioBroker
www.iobroker.org
MIT License
60 stars 26 forks source link

Firmware update status of xxxxx changed to 1 #1137

Open krobipd opened 10 months ago

krobipd commented 10 months ago

Hallo

mich würde es sehr interessieren wie ich via datenpunkt/script herausfinden kann wann ein Homematic ip geräte update fertig übertragen ist.

im log bekomme ich eine Meldung vom rpc adapter (siehe Titel) aber ich finde nirgends in den Datenpunkten diese information. dachte ursprünglich das im channel 0 der datenpunkt update_pending dies ausspucken würde, tut er aber nicht.

neopholus commented 1 week ago

Hallo @krobipd ,

vielleicht hilft dir das:

/**
 * Generiert den Status-String für den FirmwareUpdate-Status aller HMIP-Devices.
 * Der Status der Devices kann folgende Werte annehmen:
 * - UP_TO_DATE: Es liegen keine Änderungen vor.
 * - NEW_FIRMWARE_AVAILABLE: Eine neue Firmware Version liegt vor.
 * - DELIVER_FIRMWARE_IMAGE: Das ausliefern der Firmware Datei läuft.
 * - READY_FOR_UPDATE: Die Firmware Datei wurde übertragen und mit
 *   installFirmware (String device) kann der Updatevorgang gestartet werden.
 * - PERFORMING_UPDATE: Das Gerät führt den Update Vorgang aus, führt
 *   einen Werksreset durch und meldet sich dann mit einem Inclusion Request
 *   wieder und wird automatisch inkludiert.
 * 
 * @return  Ein String mit der Liste aller Devices die Beachtung im Hinblick auf FW-Updates benötigen
 */
async function generateDeviceUpdateString():Promise<string> {
    var idArray:string[] = $('state[id=hm-rpc.1.*.0.CONFIG_PENDING]').toArray();
    let updateInfo:string = '';
    let res;

    for (let i:number = 0; i < idArray.length; i++ ) {
        let id:string = idArray[i];
        let idForgetDeviceDescription:string = id.match(/[0-9A-F]{14}\.\d+/)!.at(0)!;

        // idForGetParamSet sieht so aus: 00085BE9A56142:4
        // wir brauchen um den Namen zu finden: 'hm-rpc.1.00085BE9A56142.4'
        let name:string = (<string>(<iobJS.StateObject><unknown>getObject('hm-rpc.1.' + idForgetDeviceDescription)).common.name).replace(':0','');
        // wir brauchen um es für getDeviceDescription zu verwenden: '00085BE9A56142'
        idForgetDeviceDescription = idForgetDeviceDescription.replace('.CONFIG_PENDING', '').replace('.0', ''); 

        res = await sendToAsync('hm-rpc.1', 'getDeviceDescription', {ID: idForgetDeviceDescription, paramType: 'FIRMWARE'});
        if (res?.result?.FIRMWARE_UPDATE_STATE != 'UP_TO_DATE') {
            let mappedString:string;

            switch (res?.result?.FIRMWARE_UPDATE_STATE) {
                case 'UP_TO_DATE': 
                    mappedString = 'FW aktuell'; 
                    break; 
                case 'NEW_FIRMWARE_AVAILABLE': 
                    mappedString = 'Neue FW verfügbar'; 
                    break; 
                case 'DELIVER_FIRMWARE_IMAGE': 
                    mappedString = 'Übertragung läuft'; 
                    break; 
                case 'READY_FOR_UPDATE': 
                    mappedString = 'Update per CCU starten!'; 
                    break; 
                case 'PERFORMING_UPDATE': 
                    mappedString = 'Installation läuft'; 
                    break; 
                case 'DO_UPDATE_PENDING': 
                    mappedString = 'Update am Gerät starten!'; 
                    break; 
                default: 
                    mappedString = res?.result?.FIRMWARE_UPDATE_STATE;
            }

            updateInfo += `${name}: ${mappedString}\n`;
        }
    };

    updateInfo = updateInfo.trim().split('\n').sort().join('\n');

    if (updateInfo == '') {
        updateInfo = 'Alle Geräte haben aktuelle Firmware.'
    }

    return updateInfo;
}

Falls deine HMIP-Geräte nicht unter hm-rpc.1.* hängen, musst du alle Vorkommen dieses Stings an deine Instanz-ID anpassen.

Viele Grüße Stefan