@dutchman
Ich mache das jetzt auch mit Aliasen.
Bin jetzt dazu übergegangen, die Namen der Sensoren nach folgendem Schema zu vergeben
binary_sensor:
- platform: gpio
pin: D2
name: "D2.state Bewegung 1 motion"
D2 ist der Pin ".state" was es ist (könnte z.B. auch ".temperature" sein). Die letzten 3 Werte sind dafür, was das ganze später steuern soll.
Dann habe ich mir ein Skript geschrieben, dass alle ESPs in meinem System sucht und bei denen, bei denen die Namen nach diesem Schema vergeben sind, 2 Aliase erzeugt. Eines um den ESP bequem abzufragen und eines für die Aufgabe.
var fs = require('fs');
const Fn = "/opt/iobroker/Wolfgang/esphome2.txt";
fs.writeFileSync(Fn, '');
const CrLf = String.fromCharCode(13) + String.fromCharCode(10);
function Log(s){
var AenderungszeitText = ""; //formatDate(getDateObject(new Date().getTime()), "DD.MM hh:mm:ss");
fs.appendFileSync(Fn, AenderungszeitText + "" +s + CrLf);
}
function FirstWord(OrigString){
var OrigStringSplit = OrigString.split(" ");
return(OrigStringSplit[0]);
}
function FirstX(OrigName, Count){
var OrigNameS = OrigName.split(".");
var Result = "";
for (var i = 0;i < Count; i++){Result = Result + OrigNameS[i] + ".";}
return(Result);
}
function FirstXOhnePunkt(OrigName, Count){
var OrigNameS = OrigName.split(".");
var Result = "";
for (var i = 0;i < Count - 1; i++){Result = Result + OrigNameS[i] + ".";}
Result = Result + OrigNameS[Count - 1];
return(Result);
}
const EspStates = $('esphome.0.*.state');
var LastFirst3 = "";
var LastFirst4 = "";
var Raum = ""
var EspVersion = ".0.";
var AliasName = "D1";
for(var i = 0; i < EspStates.length; i++){
var AktState = EspStates[i];
var ActFirst3 = FirstX(AktState, 3);
if (LastFirst3 != ActFirst3){
LastFirst3 = ActFirst3;
Log("");
var EspName = getState(ActFirst3 + "info.name").val;
Log("ESP = " + EspName);
switch(EspName){
case("sauna"):
Raum = "Sauna";
break;
case("gallerie2"):
Raum = "Gallerie";
break;
case("gast2"):
Raum = "Gast";
break;
case("wohnen1"):
Raum = "Wohnen";
EspVersion = ".1.";
break;
}
var EspAlias = "alias.0.Raum." + Raum + ".EspHome" + EspVersion + "alive";
var CS = "createAlias('" + EspAlias + "', '" + ActFirst3 + "info._online', '');"; //esphome.0.8CAAB57CB1E6.info._online"
Log(CS);
}
var ObjectName = FirstXOhnePunkt(EspStates[i], 5);
var obj = getObject(FirstXOhnePunkt(EspStates[i], 5));
var CommonName = obj.common.name;
var CommonNameSplit = CommonName.split(" ");
AliasName = FirstWord(CommonName);
if (AliasName.includes(".") == true)
{
Log("// " + CommonName); //
Log("// " + EspStates[i] + " " + getState(EspStates[i]).val);
// Alias ESPHome -> Raum
EspAlias = "alias.0.Raum." + Raum + ".EspHome" + EspVersion + AliasName;
var FunktionAlias = "alias.0.Raum." + Raum + "." + CommonNameSplit[1] + "." + CommonNameSplit[2] + "." + CommonNameSplit[3];
var CS = "createAlias('" + EspAlias + "', '" + EspStates[i] + "', '');";
Log(CS);
// Alias Raum -> Funktion
CS = "createAlias('" + FunktionAlias + "', '" + EspStates[i] + "', '');"
Log(CS);
//Log("createAlias('alias.0.Raum.' + Raum + '.EspHome.0.' + EspStates[i], idOrigin, '');")
}
}
Als Ergebnis erhalte ich die Datei esphome2.txt in der dann z.B. folgendes steht
ESP = wohnen1
createAlias('alias.0.Raum.Wohnen.EspHome.1.alive', 'esphome.0.8CAAB57CB1E6.info._online', '');
// D5.state Fenster 1 opened
// esphome.0.8CAAB57CB1E6.BinarySensor.1094227559.state true
createAlias('alias.0.Raum.Wohnen.EspHome.1.D5.state', 'esphome.0.8CAAB57CB1E6.BinarySensor.1094227559.state', '');
createAlias('alias.0.Raum.Wohnen.Fenster.1.opened', 'esphome.0.8CAAB57CB1E6.BinarySensor.1094227559.state', '');
Alle createAlias Zeilen, die ich brauche, kopiere ich in ein zweites Skript, dass dann die Aliase erzeugt. (Das stammt hier aus dem Forum)
In meiner Vis Umgebung oder anderen Skripten greife ich nicht mehr direkt auf die ESP Datenpunkte sondern nur noch auf die Aliase zu. Damit is es relativ egal, wie oft die Namen von ESPHome geändert werden.