NEWS
Starthilfe ? Create state aus JSON, update state (name) + read value = action
-
Hi there,
Ich brauechte da ein bischschen hilfe um werte aus zu lesen und dem entprechend eine actions aus zu loesen.
Use Case:
Per MQTT werden mir ID's, gerate name und stats uebermitteld. Mit diesem input erstellen ich mir variablen middels create state:
! ````
//Read value at update on MQTT trigger
on({id: 'mqtt.0.domoticz.out', change: "any"}, function (obj) {
var value = obj.state.val;
! //Get Value & translate to data point
var state;
var device;
var channel;//JSON values to memory
try {
obj = JSON.parse(getState('mqtt.0.domoticz.out').val);
} catch (e) {
console.error('Cannot parse: ' + getState('mqtt.0.domoticz.out').val);
return;
}
channel = obj.idx;
state = obj.nvalue;
device = obj.name;! //Log values
log(channel);
log(device);
log(state);//Create states createState('domoticz.' + channel, { name: 'Domoticz ' + device, type: 'number', role: 'switch', });
! ````
Darunter schreibe ich dan de state weg (kommt aus de JSON tabellen)
!
//Update state with value from MQTT setState('domoticz.' + channel, state, true); !
Das klappt auch so weit ganz gut, jedoch 2 problemen:
-
Wen der state noch nicht da war wird kein wert weggeschrieben, beim 2ten read klappt das dan. Wie kan man den fehler umgehen ?
-
Die unique ID bleibt immer gleich aber "name" kan sich aendern. Ich habe keine routine gefunden wie ich den "name" des states aendern kann auser state loeschen und neu erstellen. Wie kan man einen namen updaten ?
Jetzt kommt die naeste frage. Ich moechte alle werte ueberwachten und wen ein status dieser variablen sich aendert ein HTML commando uerbermitteln.
Dazu brauche ich die ID + wert damit ich das HTML commando bauwen kan.
Also, ich habe diese werte
| ID | Name | Value |
| 3 | Name 1 | 0 |
| 5 | Name 2 | 0 |
usw
Jetzt wird ID 3 von 0 auf 1 geschalted, diesen event muss ich erkennen und dan brauche ich die ID + Value zum aufbauen des schalt commandos.
Das gleiche wen eine andere ID sich aendert. Ich brauche immer nur den wert der geaender wurden und nicht alle variable in dieser gruppe.
Zudem sollte es nur getriggerd werden wen der wert aus iobroker geupdated wird (variable kan durch MQTT oder iObroker aendern, trigger nur wen source iObroker)
Kan mir jemand auf die sprunge helfen ?
-
-
ok problem 1 habe ich geloest, wen trigger kommt dan will ich die ID vom geraet wissen welches ihn verursacht hat.
var value = obj.id;
Damit schreibe ich die ID in eine variable um sie spaeter in einer funtion nutzen zu koennen, 2 offenen sachen noch:
-
Wie kan ich nach einen create state den namen wieder aendern
-
Wie kan ich auf alle werte unnerhalb einer structur triggern lassen
Waere toll wen jemand ne antwort hat, inzwischen suche/probieren ich mal weiter
-
-
- Wie kan ich nach einen create state den namen wieder aendern `
var obj = getObject(id); obj.common.name = "neuer_name"; setObject(obj);
- Wie kan ich auf alle werte unnerhalb einer structur triggern lassen `
Mit https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/RegExp in on().
-
Waere toll wen jemand ne antwort hat, `
Ich meine das war vor gar nicht so langer Zeit eine vergleichbare frage.Trigger mit mehreren on () oder so ähnlich.
Ich meine damals hätte @Bluefox und noch jemand geantwortet.
Ihr Skriptprofis seid gefragt!
Edit: paul53 ist schon da!
Gruß
Rainer
-
- Wie kan ich nach einen create state den namen wieder aendern `
var obj = getObject(id); obj.common.name = "neuer_name"; setObject(obj);
- Wie kan ich auf alle werte unnerhalb einer structur triggern lassen
Mit [https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/RegExp](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/RegExp) in on().
danke dir Paul das hilft weiter auf jeden fall habe ich das mit dem namen hinbekommen.
Regexp verstehe ich wie im beispiel ;
on(/^ping\.0\.Iobroker-Server\.(192.xxx.xxx.xx1|192.xxx.xxx.xx2)
Nur hierin sind ja auch werte definiert, bei mir sollte er triggern auf alles in dem baum (in die variabelen werden dynamisch erzeugt, kan diese also nicht vorab festlegen.)
oder verstehe ich das jetzt falsch ?
Kanst du mir eventueel auf die sprunge helfen diesen ON richtig um zu stellen ? (der RegExp ist bestimmt falsch da war ein versuch)
on({id: "javascript.0.domoticz.7", change: "any", RegExp}, function (obj) { var value = obj.id; log (value);
anstatt der ID 7 sollte er halt auf alle ID in dieser structur triggeren.
Mit denm obj.id sehe ich ja welche ID getriggerd hat um dan das URL commando zu bauen
Edit: Geschafft ! Die loesung war:
on({id: RegExp("javascript.0.domoticz."), change: "any"}, function (obj) { var value = obj.id; log (value); });