NEWS
Windrichtung kommt mit 0-5V an soll in Windrichtung N/S/W/O
-
Hallo zusammen,
wie ihr gleich seht bin ich nicht der beste im scripten
Ich bekommen eine Windrichtung von 0-5V mit MQTT, dieser soll dann umgewandelt werden in Begrifflichkeiten.// Original-Datenpunkt const idOrigin = 'mqtt.0.WindJet.Windrichtung_Nord.Windrichtung'; // Alias-Datenpunkt const idAlias = 'Windrichtung.Windrichtung'; var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk; // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich // nameAlias = 'Batterie Deckenlicht'; desc = 'per Script erstellt'; // typeAlias = 'boolean'; // oder 'number' // read = "val < 20 ? true : false"; // Erkennung "Aus" --> false erfolgt automatisch // write = "val ? 'Ein' : 'Aus'"; // role = 'indicator'; // min = 0; // nur Zahlen // max = 100; // nur Zahlen // unit = '%'; // nur für Zahlen let between = (x, min, max) => x >= min && x <= max; const direction = value => { switch (true) { case between(value, 2.3408, 2.9658) || between(value, 12.0,12.0): console.log("NORD"); return "NORD"; case between(value, 2.9659, 3.5908): console.log("NORD-OST"); return "NORD-OST"; case between(value, 3.5909, 3.9158): console.log("OST"); return "OST"; case between(value, 3.9159, 4.5408): console.log("SÜD-OST"); return "SÜD-OST"; case between(value, 4.5409, 5.0000): console.log("SÜD"); return "SÜD"; case between(value, 0.0000, 0.4658): console.log("SÜD"); return "SÜD"; case between(value, 0.4659, 1.0908): console.log("SÜD-WEST"); return "SÜD-WEST"; case between(value, 1.0909, 1.7158): console.log("WEST"); return "WEST"; case between(value, 1.7158, 2.3407): console.log("NORD-WEST"); return "NORD-WEST"; } } console.log(`Die Himmelsrichtung ist: ${(direction(12.0))}`); // direction liefert dann die Himmelsrichtung // custom = []; // verhindert doppelte Ausführung von history, ... // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten ! // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten ! function createAlias(idSrc, idDst) { if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn'); else { var obj = {}; obj.type = 'state'; obj.common = getObject(idSrc).common; obj.common.alias = {}; obj.common.alias.id = idSrc; if(typeAlias) obj.common.type = typeAlias; if(obj.common.read !== false && read) obj.common.alias.read = read; if(obj.common.write !== false && write) obj.common.alias.write = write; if(nameAlias) obj.common.name = nameAlias; if(role) obj.common.role = role; if(desc) obj.common.desc = desc; if(min !== undefined) obj.common.min = min; if(max !== undefined) obj.common.max = max; if(unit) obj.common.unit = unit; if(states) obj.common.states = states; if(custom && obj.common.custom) obj.common.custom = custom; obj.native = {}; setObject(idDst, obj); if(raum && getObject('enum.rooms.' + raum)) { let obj = getObject('enum.rooms.' + raum) obj.common.members.push(idDst); setObject('enum.rooms.' + raum, obj); } if(gewerk && getObject('enum.functions.' + gewerk)) { let obj = getObject('enum.functions.' + gewerk) obj.common.members.push(idDst); setObject('enum.functions.' + gewerk, obj); } } } createAlias(idOrigin, 'alias.0.' + idAlias);
es will einfach nicht, kann einer Helfen?
MfG
-
-
Du wendest das
switch
völlig falsch an.
https://www.w3schools.com/js/js_switch.asptrue
ist eine Konstante - die ändert sich nicht und daher kann die auch nie zwischen x und y sein.Versuch's mal zunächst so:
if (between(value, 2.3408, 2.9658) || between(value, 12.0,12.0)) { console.log("NORD"); return "NORD"; } else if (between(value, 2.9659, 3.5908)) { console.log("NORD-OST"); return "NORD-OST"; } else if (between(value, 3.5909, 3.9158)) { console.log("OST"); return "OST"; }
-
@acidsubway
Ein Alias repräsentiert einen anderen DP.
So wie Du das machen willst, wird das nix.
Da schreibt man nicht per Script rein.Lege den von Dir gewünschten DP nicht als Alias, sondern unterhalb von
0_userdata
an. -
@codierknecht sagte: DP nicht als Alias, sondern unterhalb von 0_userdata an.
... und prüfe die Spannungen in der passenden Reihenfolge.
const idVolt = 'mqtt.0.WindJet.Windrichtung_Nord.Windrichtung'; const idDir = '0_userdata.0.Wetter.Wind.Richtung'; on(idVolt, function(dp) { const v = dp.state.val; let dir = 'SÜD'; if(v <= 0.4658) dir = 'SÜD'; else if(v <= 1.0908) dir = 'SÜD-WEST'; else if(v <= 1.7158) dir = 'WEST'; // usw. setState(idDir, dir, true); });
-
@paul53
DankeAuch allen anderen ein dank erst mal.
hab das nun so umgeändert
const idVolt = 'mqtt.0.WindJet.Windrichtung_Nord.Windrichtung'; const idDir = '0_userdata.0.Wetter.Windrichtung'; on(idVolt, function(dp) { const v = dp.state.val; let dir = 'SÜD'; if(v <= 0.4658) dir = 'SÜD'; else if(v <= 1.0908) dir = 'SÜD-WEST'; else if(v <= 1.7158) dir = 'WEST'; else if(v <= 2.3407) dir = 'NORD-WEST'; else if(v <= 2.9658) dir = 'NORD'; else if(v <= 3.5908) dir = 'NORD-OST'; else if(v <= 3.9158) dir = 'OST'; else if(v <= 4.5408) dir = 'SÜD-OST'; else if(v <= 5.0000) dir = 'SÜD'; setState(idDir, dir, true); });
kommt aber ein komische fehler:
251 2024-01-26 12:25:07.005 warn Object of state "0_userdata.0.Wetter.Windrichtung" is missing the required property "common.type"
ich mach sier was falsch
-
@acidsubway
Zeig mal, wie Dein DP0_userdata.0.Wetter.Windrichtung
definiert ist. -
-
@acidsubway
Das ist ein "folder" - da kann man nix reinschreiben.
Lege Dir darunter einen DP vom Typ "Zeichenfolge" an. Den kannst Du dann beschreiben. -
Hat geklappt, Danke Dir, euch allen ein DANKE!!!
-
@acidsubway sagte: hab das nun so umgeändert
Das letzte else if (Zeile 15) kann wegfallen, da
dir
mit "SÜD" vordefiniert ist. -
Wieso überhaupt ein script und nicht einen echten Alias mit einer read formel?
val <= 0.4658 ? 'SÜD' : val <= 1.0908 ? 'SÜD-WEST' : val <= 1.7158 ? 'WEST' : val <= 2.3407 ? 'NORD-WEST' : val <= 2.9658 ? 'NORD' : val <= 3.5908 ? 'NORD-OST' : val <= 3.9158 ? 'OST' : val <= 4.5408 ? 'SÜD-OST' : val <= 5.0000 ? 'SÜD' : 'SÜD';