NEWS
simple-api abfrage: alle offenen Türen
-
Hallo zusammen
Wie kann ich mit einer Simple-API-Abfrage die Namen aller offenen Türen erhalten?
deconz.0.Sensors.X.open = true
und den Namen dazu deconz.0.Sensors["Name"]Zusatzfrage: Ist es möglich, über simple-api ein eigenes script auszuführen und werte zurückzugeben?
Danke, Sven
-
@Dominic-Reber sagte:
Wie kann ich mit einer Simple-API-Abfrage die Namen aller offenen Türen erhalten?
Gar nicht, es sei denn, es gibt einen Datenpunkt, der die Namen aller offen Türen enthält.
-
@paul53
Schade, ich schaffs alle sensoren auszulesen, die "open" = true haben, aber den dazugehörigen Namen kann ich nirgends auslesen... Schade.Mach ich halt eine Doppelabfrage.
objects liefert den Namen, states den status -
@Dominic-Reber sagte:
den dazugehörigen Namen kann ich nirgends auslesen... Schade.
Dazu benötigt man ein Script auf ioBroker, das auf jede Türbewegung reagiert und die Namen der offenen Türen in einen Datenpunkt schreibt. Dieser Datenpunkt kann zu jeder Zeit per Simple-API abgefragt werden. Beispiel-Skript:
const idsOpen = $('deconz.0.Sensors.*.open'); const idNamen = '0_userdata.0.Offen.Namen'; function checkOpen() { let names = []; idsOpen.each(function(id, i) { if(getState(id).val) names.push(getObject(id).common.name); }); let text = 'alle Türen sind geschlossen'; if(names.length) text = 'offene Türen: ' + names.join(', '); setState(idNamen, text, true); } createState(idNamen, '', {type: 'string', name: 'Namen offener Türen', role: 'info'}, checkOpen); idsOpen.on(checkOpen); // Wertänderung
-
Dazu ein konkretes Beispiel.
Aus alten Zeiten habe ich für jedes Fenster eine Homematic-Variable, in die ein Text geschrieben wird, wenn ein Fenster offen ist.
Diese Variable wird zum ioBroker übertragen.
Dort hat diese Variable den leider wenig sprechenden Datenpunkthm-rega.0.7419
und mit einer simpleApi Abfrage
http://192.168.1.25:8087/get/hm-rega.0.7419/?prettyPrint
bekomme ich in diesem Fall ein recht komplexes Objekt in JSON
{ "val": "WC-Fenster", "ack": true, "ts": 1607927113044, "q": 0, "from": "system.adapter.hm-rega.0", "user": "system.user.admin", "lc": 1608927984804, "_id": "hm-rega.0.7419", "type": "state", "common": { "name": "AllesZu_msg_WC", "type": "string", "read": true, "write": true, "role": "state", "desc": "Texpuffer WC", "custom": { "history.0": { "enabled": true, "changesOnly": true, "debounce": "", "maxLength": "", "retention": 0, "changesRelogInterval": "", "changesMinDelta": "", "aliasId": "" }, "influxdb.0": { "enabled": true, "changesOnly": false, "debounce": "", "retention": 0, "changesRelogInterval": 0, "changesMinDelta": 0, "storageType": "" } } }, "native": { "Name": "AllesZu_msg_WC", "TypeName": "VARDP", "DPInfo": "Texpuffer WC", "ValueMin": null, "ValueMax": null, "ValueUnit": "", "ValueType": 20, "ValueSubType": 11, "ValueList": "" }, "acl": { "object": 1636, "state": 1636 } }
relevant ist in diesem Fall der Wert des Strings
"val": "WC-Fenster",
Wird das Fenster wieder geschlossen, dann schreibe ich einen Leerstring in diese Variable und ioBroker antwortet auf obige Abfrage mit einem geänderten Wert
"val": "",
Die Ausgabe kommt wie gezeigt im JSON Format, wenn man /?prettyPrint anhängt.
Wenn man das wegläßt kommt einfach plain textval "" ack true ts 1607927113044 q 0 from "system.adapter.hm-rega.0" user "system.user.admin" lc 1608929424856 _id "hm-rega.0.7419" type "state" common name "AllesZu_msg_WC" type "string" read true write true role "state" desc "Texpuffer WC" custom history.0 enabled true changesOnly true debounce "" maxLength "" retention 0 changesRelogInterval "" changesMinDelta "" aliasId "" influxdb.0 enabled true changesOnly false debounce "" retention 0 changesRelogInterval 0 changesMinDelta 0 storageType "" native Name "AllesZu_msg_WC" TypeName "VARDP" DPInfo "Texpuffer WC" ValueMin null ValueMax null ValueUnit "" ValueType 20 ValueSubType 11 ValueList "" acl object 1636 state 1636
Einen manuell angelegten Datenpunkt kann man sicher einfacher gestalten. Aber um ein Parsen auf dem Empfänger wird man nicht herumkommen.
Man kann jetzt also vom verarbeitenden Gerät aus alle Datenpunkte einzeln oder per bulk abfragen und hat damit die Komplexität dort.
Oder man legt etwas mehr Komplexität in den ioBroker und schreibt ein Schript, welches eine Liste der offenen Türen zusammenstellt und holt dann per get diese Liste ab.Zur Zusatzfrage: Man kann ein Script auslösen, wenn man per simpleApi "set" einen Datenpunkt verändert (oder zumindest setzt) und das JavaScript auf diese Veränderung bzw. das Setzen triggern läßt.
-
Super, danke euch beiden!