Open daniel-finger opened 10 months ago
Ich konnte es eingrenzen auf den Codeblock:
if (!smartName.ghAttributes && traitEnum[smartName.ghTraits[0]].defaultAttributes) {
const defaultAttributes = traitEnum[smartName.ghTraits[0]].defaultAttributes;
result[id].attributes = JSON.parse(defaultAttributes);
const obj = await this.adapter.getForeignObjectAsync(id);
if (!obj.common ||
!obj.common.smartName ||
!obj.common.smartName.ghAttributes ||
obj.common.smartName.ghAttributes !== defaultAttributes
) {
this.adapter.log.error('awaiting extend');
await this.adapter.extendForeignObjectAsync(id, {
common: {
smartName: {
ghAttributes: defaultAttributes,
},
},
});
}
} else {
result[id].attributes = {};
}
}
in der Funktion processState. Der geht hier in den else Zweig rein. Ich hab den Code mal angepasst:
if (!smartName.ghAttributes && traitEnum[smartName.ghTraits[0]].defaultAttributes) {
const defaultAttributes = traitEnum[smartName.ghTraits[0]].defaultAttributes;
result[id].attributes = JSON.parse(defaultAttributes);
const obj = await this.adapter.getForeignObjectAsync(id);
if (!obj.common ||
!obj.common.smartName ||
!obj.common.smartName.ghAttributes ||
obj.common.smartName.ghAttributes !== defaultAttributes
) {
this.adapter.log.error('awaiting extend');
await this.adapter.extendForeignObjectAsync(id, {
common: {
smartName: {
ghAttributes: defaultAttributes,
},
},
});
}
} else {
this.adapter.log.error('!smartName.ghAttributes && traitEnum[smartName.ghTraits[0]].defaultAttributes was true');
if (!smartName.ghAttributes) {
this.adapter.log.error('!smartName.ghAttributes evaluated to true: ' + smartName.ghAttributes);
result[id].attributes = {};
} else {
this.adapter.log.error('!smartName.ghAttributes evaluated to false: ' + smartName.ghAttributes);
}
if (traitEnum[smartName.ghTraits[0]].defaultAttributes) {
this.adapter.log.error('traitEnum[smartName.ghTraits[0]].defaultAttributes evaluated to true');
}
}
}
Das Log sagt dazu:
!smartName.ghAttributes && traitEnum[smartName.ghTraits[0]].defaultAttributes was true !smartName.ghAttributes evaluated to false: {"availableThermostatModes":["off","heat","eco"],"thermostatTemperatureRange":{"minThresholdCelsius":8,"maxThresholdCelsius":29},"thermostatTemperatureUnit":"C"} traitEnum[smartName.ghTraits[0]].defaultAttributes evaluated to true
Die zusätzliche Prüfung auf if (!smartName.ghAttributes) { im else Zweig fixed am Ende das Problem.
Ich vermute hier soll attributes auf jeden Fall erzeugt werden mit den Trait default Attributen oder eben {} wenn es danach immer noch nicht gefüllt ist? Ich muss zugeben, ich verstehe nicht genau, was hier passieren soll. Sollte es nicht reichen, wenn am Ende nur noch gecheckt wird ob result[id].attributes undefined ist? So ganz generell?
Bug
Nach dem Anlegen eines Thermostats mit den Traits
ist dieses in Google Home nicht bedienbar. Ich glaube es liegt daran, das die thermostatTemperatureRange bei einem SYNC nicht übermittelt wird.
Um es nachzustellen
Anlegen eines Thermostat mit den obigen drei Traits. In das Feld Attribute vom Thermostat_SetTemp (oder in alle drei, macht keinen Unterschied) habe ich bei allen drei das folgende JSON reinkopiert:
Danach der SYNC mit "Synchronisiere meine Smart Home Geräte gestartet. Erwartetes Verhalten
Anzeige des Thermostats und Steuerbarkeit in Google Home
Screenshots & Logfiles
Hier im Log ist zu sehen das nur "type": "action.devices.types.THERMOSTAT", "attributes": {}, im Beispiel Heizung Küche übergeben wird.
Logs
Versions: