Ich hätte da was für die Kategorie Shelly. Damit in Blockly-Skripten zum Beispiel bei einem Trigger für einen Schaltzustand nicht einfach nur "Switch" steht, sondern man direkt den Gerätenamen, Kanalnamen und den Namen des Eigenschaftswertes sieht, habe ich etwas geskriptet. Dieses Skript updated den Common-Name der einzelnen Knoten der Shellygeräte, so das man dann sehr schön sehen kann, was genau im Blockly Skript geschrieben oder gelesen wird.
var shellies = $('shelly.0.*.name');
var generalTemplate = {
'factoryResetFromSwitch': 'Firmwareupdate via Schalter',
'firmware': 'Firmware Update verfügbar',
'firmwareupdate': 'Firmware Update auslösen',
'hostname': 'Hostname',
'id': 'Gerätetyp',
'mode': 'Modus',
'name': 'Gerätename',
'online': 'Verfügbar',
'overtemperature': 'Überhitzt',
'protocol': 'verwendetes Protokoll',
'reboot': 'Neustarten',
'rssi': 'WLAN-Empfang',
'temperatureC': 'Gerätetemperatur in °C',
'temperatureF': 'Gerätetemperatur in °F',
'type': 'Gerätetyp',
'uptime': 'Onlinezeit',
'version': 'Firmware Version',
'ext': 'externe Sensoren',
'ext.humidity1': 'Luftfeuchtigkeit 1',
'ext.humidity2': 'Luftfeuchtigkeit 2',
'ext.humidity3': 'Luftfeuchtigkeit 3',
'ext.temperatureC1': 'Temperatur 1 in °C',
'ext.temperatureC2': 'Temperatur 2 in °C',
'ext.temperatureC3': 'Temperatur 3 in °C',
'ext.temperatureF1': 'Temperatur 1 in °F',
'ext.temperatureF2': 'Temperatur 2 in °F',
'ext.temperatureF3': 'Temperatur 3 in °F',
'Shutter': 'Jalousiesteuerung',
'Shutter.ButtonReverse': 'Button umkehren',
'Shutter.ButtonType': 'Button-Typ',
'Shutter.Close': 'Schließen',
'Shutter.Duration': 'Dauer',
'Shutter.Energy': 'Zähler',
'Shutter.Open': 'Öffnen',
'Shutter.Pause': 'Pausieren',
'Shutter.Position': 'Position',
'Shutter.Power': 'Momentanverbrauch',
'Shutter.StopReason': 'Stoppgrund',
'Shutter.state': 'Status',
}
var dimmerTemplate = {
'AutoTimerOff': 'Ausschalttimer',
'AutoTimerOn': 'Einschalttimer',
'ButtonType': 'Button-Typ',
'ChannelName': 'Kanalname',
'Energy': 'Zähler',
'Event1': 'letztes Ereignis rechts',
'Event2': 'letztes Ereignis links',
'EventCount1': 'Anzahl Ereignisse rechts',
'EventCount2': 'Anzahl Ereignisse links',
'Input1': 'rechter Schalter gedrückt',
'Input2': 'linker Schalter gedrückt',
'Power': 'Momentanverbrauch',
'Switch': 'Schaltzustand',
'brightness': 'Helligkeit',
'longpush1': 'rechts lang gedrückt',
'longpush2': 'links lang gedrückt',
'mode': 'Modus',
}
var relayTemplate = {
'AutoTimerOff': 'Ausschalttimer',
'AutoTimerOn': 'Einschalttimer',
'ButtonReverse': 'Button umkehren',
'ButtonType': 'Button-Typ',
'ChannelName': 'Kanalname',
'Name': 'Kanalname',
'Energy': 'Zähler',
'Event': 'letztes Ereignis',
'EventCount': 'Anzahl Ereignisse',
'Input': 'Schalter gedrückt',
'Power': 'Momentanverbrauch',
'Switch': 'Schaltzustand',
'Timer': 'Timer',
'longpush': 'lang gedrückt',
'longpushtime': 'Dauer langes drücken',
}
var updateCount = 0;
console.log('Dem System sind ' + shellies.length + ' Geräte von Shelly bekannt.');
shellies.each(
function(id, i) {
var shellyId = id.split(".").slice(0,-1).join(".");
var lightsChannelName = $(shellyId + '.lights.ChannelName');
var relay0ChannelName = lightsChannelName.length == 0 ? $(shellyId + '.Relay0.ChannelName') : [];
var relay1ChannelName = relay0ChannelName.length > 0 ? $(shellyId + '.Relay1.ChannelName') : [];
var relay2ChannelName = relay1ChannelName.length > 0 ? $(shellyId + '.Relay2.ChannelName') : [];
var deviceName = getState(id).val;
var obj = null;
var relays = [];
// Fallback für den i3 (dieser nutzt nicht ChannelName, sondern Name für den Kanalnamen)
if(lightsChannelName.length == 0 && relay0ChannelName.length == 0) {
relay0ChannelName = lightsChannelName.length == 0 ? $(shellyId + '.Relay0.Name') : [];
relay1ChannelName = relay0ChannelName.length > 0 ? $(shellyId + '.Relay1.Name') : [];
relay2ChannelName = relay1ChannelName.length > 0 ? $(shellyId + '.Relay2.Name') : [];
}
for(const [key, value] of Object.entries(generalTemplate)) {
obj = getObject(shellyId + '.' + key);
if(obj && obj.common.name != (deviceName + ' ' + value).trim()) {
obj.common.name = (deviceName + ' ' + value).trim();
setObject(shellyId + '.' + key, obj);
updateCount++;
}
}
if(lightsChannelName.length > 0) {
var channelName = getState(lightsChannelName[0]).val;
if(channelName != deviceName)
channelName = deviceName + ' ' + channelName;
for(const [key, value] of Object.entries(dimmerTemplate)) {
obj = getObject(shellyId + '.lights.' + key);
if(obj && obj.common.name != (channelName + ' ' + value).trim()) {
obj.common.name = (channelName + ' ' + value).trim();
setObject(shellyId + '.lights.' + key, obj);
updateCount++;
}
}
}
if(relay0ChannelName.length > 0)
relays.push(getState(relay0ChannelName[0]).val);
if(relay1ChannelName.length > 0)
relays.push(getState(relay1ChannelName[0]).val);
if(relay2ChannelName.length > 0)
relays.push(getState(relay2ChannelName[0]).val);
for(var i = 0; i < relays.length; i++) {
var channelName = relays[i];
if(channelName != deviceName)
channelName = deviceName + ' ' + channelName;
for(const [key, value] of Object.entries(relayTemplate)) {
obj = getObject(shellyId + '.Relay' + i + '.' + key);
if(obj && obj.common.name != (channelName + ' ' + value).trim()) {
obj.common.name = (channelName + ' ' + value).trim();
setObject(shellyId + '.Relay' + i + '.' + key, obj);
updateCount++;
}
}
}
}
);
console.log('Es wurden ' + updateCount + ' Objektnamen aktualisiert.');
Ich hoffe meine Templates sind einigermaßen vollständig. Ich habe nur Shelly 1, Shelly 1PM, Shelly 2.5, Shelly Dimmer 2 und Shelly i3 hier zu Hause im Einsatz. Möglichweise werden weitere Templates benötigt oder die vorhandenen Templates oben im Skript müssen erweitert werden, um weitere Werte abzufragen.
Das Skript kann einmal manuell gestartet werden, wenn man Shelly Geräte hinzugefügt oder umbenannt hat.
Hier noch ein Beispiel in der Objekthierarchie:
Und dann im Blockly Skript: