NEWS
Blockly DP in Alias setzen ohne direkte Wirkung (alarm)
-
hi,
ich habe zigbee-alarme oder -sirenen bekommen. Die funktionieren an sich auch. ich kann Lautstärke, Dauer, und Alarmton (ringtone) einstellen. für "ringtone" sind dabei 32 verschiedene Töne dabei, benannt mit "ringtone 1" bis "ringtone 32".
damit ich bei einem möglichen umtausch der geräte nicht alles in script und visualisierung anpassen muss, sind die devices auch als alias angelegt.
ändere ich nun im alias den ringtone, funktioniert alles. ringtone ändert sich auch im entsprechenden Gerät.Nun kommt blockly ins Spiel. Das Blockly-Script wird getriggered, sobald die Klingeltaste ausgelöst wird. Script läuft und setzt in den Alias-DPen den ringtone. Im DP sehe ich den geänderten ringtone, auch im Gerät wird der ringtone geändert. aber es ertönt der vorherige ringtone.
ich habe shcon versucht mit einem timeout zu arbeitne, aber das scheint nicht das problem zu sein.hat jemand eine idee, woran das liegen könnte?
gruß,
andre -
@astrakid
WIE setzt du den neuen Wert?
Input in ein Gerät muss mit ack=false erfolgen. -
@astrakid
Das was @mcm1957 sagt. "Steuere" statt "Aktualisiere".https://forum.iobroker.net/topic/70481/blockly-for-dummies-starthilfe-und-tipps/6
-
@codierknecht das mache ich dann scheinbar schon korrekt:
-
@astrakid sagte in Blockly DP in Alias setzen ohne direkte Wirkung (alarm):
für "ringtone" sind dabei 32 verschiedene Töne dabei, benannt mit "ringtone 1" bis "ringtone 32"
Und was schreibst Du da rein?
Einen String oder eine Zahl?Schau mal in die Objektdaten des Ziel-DP. Gut möglich, dass die "Ringtones" eigentlich Zahlen sind und nur über die internen States zu Strings konvertiert werden.
-
@codierknecht ich schreibe einen string rein, so wie der DP auch definiert ist:
{ "type": "state", "common": { "name": "ringtone", "type": "string", "states": { "ringtone 1": "ringtone 1", "ringtone 2": "ringtone 2", "ringtone 3": "ringtone 3", "ringtone 4": "ringtone 4", "ringtone 5": "ringtone 5", "ringtone 6": "ringtone 6", "ringtone 7": "ringtone 7", "ringtone 8": "ringtone 8", "ringtone 9": "ringtone 9", "ringtone 10": "ringtone 10", "ringtone 11": "ringtone 11", "ringtone 12": "ringtone 12", "ringtone 13": "ringtone 13", "ringtone 14": "ringtone 14", "ringtone 15": "ringtone 15", "ringtone 16": "ringtone 16", "ringtone 17": "ringtone 17", "ringtone 18": "ringtone 18", "ringtone 19": "ringtone 19", "ringtone 20": "ringtone 20", "ringtone 21": "ringtone 21", "ringtone 22": "ringtone 22", "ringtone 23": "ringtone 23", "ringtone 24": "ringtone 24", "ringtone 25": "ringtone 25", "ringtone 26": "ringtone 26", "ringtone 27": "ringtone 27", "ringtone 28": "ringtone 28", "ringtone 29": "ringtone 29", "ringtone 30": "ringtone 30", "ringtone 31": "ringtone 31", "ringtone 32": "ringtone 32" }, "read": true, "write": true, "role": "state" }, "native": {}, "from": "system.adapter.zigbee.0", "user": "system.user.admin", "ts": 1729192845103, "_id": "zigbee.0.a4c138a9240eb001.ringtone", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }
das hier ist der ausschnitt aus dem script:
on({ id: [].concat(['0_userdata.0.example_bool']).concat(['alias.0.sensors.waterleakage.spuelmaschine.detected']).concat(['alias.0.sensors.waterleakage.trockenboden.detected']), change: 'ne' }, async (obj) => { console.warn('script ausgeloest'); alarm_lautstaerke = 'low'; alarm_ton = 'ringtone 7'; alarm_dauer = 2; alarm_an = true; console.warn(alarm_ton); if ((getState('alias.0.sensors.waterleakage.spuelmaschine.detected').val == true) || (getState('alias.0.sensors.waterleakage.trockenboden.detected').val == true) || (getState('0_userdata.0.example_bool').val == true)) { console.info('alarm ausloesen'); setState('alias.0.alarm.alarm1.duration' /* duration */, alarm_dauer); console.info(alarm_dauer); setState('alias.0.alarm.alarm1.volume' /* volume */, alarm_lautstaerke); console.info(alarm_lautstaerke); setState('alias.0.alarm.alarm1.ringtone' /* ringtone */, alarm_ton); console.info(alarm_ton); setState('alias.0.alarm.alarm1.alarm' /* alarm */, alarm_an); console.info(alarm_an); console.info(alarm_dauer); console.info(alarm_lautstaerke); console.info(alarm_ton); console.info(alarm_an); } else { setState('alias.0.alarm.alarm1.alarm' /* alarm */, false); setState('alias.0.alarm.alarm2.alarm' /* alarm */, false); }
das script an sich funktioniert. hab als trigger derzeit noch einen schalter drin, um den test auslösen zu können.
-
@astrakid sagte in Blockly DP in Alias setzen ohne direkte Wirkung (alarm):
aber es ertönt der vorherige ringtone
Das ist das eigentliche Problem? Sorry - hat ein bisschen gedauert bis der Groschen gefallen ist.
das hier ist der ausschnitt aus dem script:
Du machst das per Blockly? Dann hilft das Script nicht wirklich weiter. Besser wäre, das Blockly zu exportieren
und das Ergebnis dann hier zu posten (natürlich in Code-Tags </>, am besten hinter einem Spoiler).
Das aber immer in Verbindung mit dem Screenshot.
Grund: Nicht jeder will sich das Blockly importieren, um einen Blich darauf werfen zu können.
Und das generierte Script im Kopf wieder in Blockly zu wandeln ist auch nicht jedem gegeben.Bei Prüfungen bool'scher Werte muss man nicht mit "= Wahr" prüfen. Der Wert selbst ist ja bereits wahr oder falsch.
https://forum.iobroker.net/topic/70481/blockly-for-dummies-starthilfe-und-tipps/8 (Tipp 2)Bindestriche in Variablen sind unschön. Die werden zwar intern in Unterstriche gewandelt, ich würde diese Umwandlung aber gleich verhindern. Falls man mal direkt in JS programmiert, könnte man darüber stolpern. Dann wird das nämlich schnell zu einer Subtraktion.
Aber das nur am Rande.
Versuch mal, den eigentlichen Alarm erst nach einem kurzen Timeout auszulösen.
Gut möglich, dass der Alarm bereits ausgelöst wird bevor das Setzen des Ringtone tatsächlich erfolgt ist.
Vielleicht reicht auch, lediglich die Reihenfolge zu ändern (Ringtone zuerst, Alarm zuletzt). -
@codierknecht sagte in Blockly DP in Alias setzen ohne direkte Wirkung (alarm):
auch, lediglich die Reihenfolge zu ändern (Ringtone zuerst, Alarm
oh man, das einfache tauschen der reihenfolge hat gereicht!!! herzlichen dank!!!