NEWS
[gelöst] Datenpunkte in Variablen zusammenfassen
-
Hallo,
ich habe hier ein Script, welches die Timestamps der Zigbee-Sensoren in eigenen Datenpunkten ablegt.const HexAddress = '00158d00032400af'; const MijiaSwitch = [ 'zigbee.0.00158d00032400af.click' , 'zigbee.0.00158d00032400af.double_click' , 'zigbee.0.00158d00032400af.triple_click' , 'zigbee.0.00158d00032400af.quad_click' , 'zigbee.0.00158d00032400af.many_click' ]; const Path = '0_userdata.0.zigbee.'; on({id: MijiaSwitch, val:true}, function (dp) { var time = formatDate(Number(dp.state.ts), 'TT-MM-JJ hh:mm:ss'); var change = formatDate(Number(dp.state.lc), 'hh:mm:ss'); setState(Path + HexAddress + '.' + 'ts', time); setState(Path + HexAddress + '.' + 'lc', change); });
Wie könnte ich die Zeile "const MijiaSwitch = [ 'zigbee ..." vereinfachen, so daß ich nicht jeden Datenpunkt für jede Funktion des Schalters eintragen muss? Also, vom Prinzip her, so etwas wie - 'zigbee.0.' + HexAddress + '.*'
Könnt Ihr mir einen Tipp geben?PS: Allen ein gesundes neues Jahr!
-
-
Danke, Paul!
Der $Selector hilft tatsächlich. Es funktioniert soweit wie gewünscht.
Nur ein kleines Problem habe ich noch. Ist es möglich Adresse des Sensors als Variable in die Selector - Funktion einzufügen. Daran strauchele ich im Moment.
Diese Variante funktioniert -$('state[id=zigbee.0.00158d00032400af.*]').each(function(id, i) { ... });
und diese nicht -
const SensorHexAddress = '00158d00032400af'; var SensorPath = ('zigbee.0.' + SensorHexAddress + '.*'); $('state[id = (SensorPath)]').each(function(id, i) { ... });
Wo liegt mein Fehler?
-
@Heidi02 sagte:
und diese nicht -
Ich habe es zwar noch nicht getestet, aber meiner Meinung nach sollte eine normale String-Verkettung funktionieren. Versuche es mal so:
const SensorHexAddress = '00158d00032400af'; const SensorPath = 'zigbee.0.' + SensorHexAddress + '.*'; $('state[id=' + SensorPath + ']').each(function(id, i) { ... });
wobei das auch funktionieren sollte:
const SensorHexAddress = '00158d00032400af'; const SensorPath = 'zigbee.0.' + SensorHexAddress + '.*'; $(SensorPath).each(function(id, i) { ... });
-
@paul53
Vielen Dank für Deine Hilfe!Beide Varianten Deiner Lösung funktionieren tadellos. Ich sehe schon, daß ich in Sachen JS / TS noch viel zu lernen habe.
So sieht das ganze "Machwerk" aus. Eventuell kann es ja jemand gebrauchen. Verbesserungsvorschläge oder Tipps sind gern gesehen.
export {}; const SensorHexAddress = '00158d00032400af'; const UserdataPath = '0_userdata.0.zigbee.'; var SensorPath = ('zigbee.0.' + SensorHexAddress + '.*'); var SensorStat = []; $(SensorPath).each(function(id, i) { SensorStat.push(id); }); on({id: SensorStat , val:true}, function (dp) { var timestamp = formatDate(Number(dp.state.ts), 'TT-MM-JJ hh:mm:ss'); var lastchange = formatDate(Number(dp.state.lc), 'hh:mm:ss'); setState(UserdataPath + SensorHexAddress + '.' + 'ts', timestamp); setState(UserdataPath + SensorHexAddress + '.' + 'lc', lastchange); });
-
Achso:
Ich hatte zum Testen des Scripts einen Taster verwendet da der viele verschiedene states zurückliefert und natürlich auch schnell gedrückt ist.
Bei Verwendung anderer Sensoren, welche Werte zurückliefern anstatt logischer Zustände, müsste die Zeileon({id: SensorStat , val:true}, function (dp) {
geändert werden in
on({id: SensorStat , change: 'any'}, function (dp) {
.