Ok den habe ich noch nicht gesehen, die 2.0.9 habe ich nur auf dem Testsystem.
Meine Schalter hatte ich schon auf 2.0.7 oder vorher.
Ok den habe ich noch nicht gesehen, die 2.0.9 habe ich nur auf dem Testsystem.
Meine Schalter hatte ich schon auf 2.0.7 oder vorher.
Ich habe jetzt ein paar Softwareschalter für die App hinzugefügt.
Ich kann den Wert “custom key” jedoch nicht abfragen.
Wenn ich in der Function mir über msg.warn den Input ausgeben lasse, ist dieser undefined.
jemand eine Idee?node.warn (msg.payload)
node.warn (msg.object)node.warn (msg.object.customKey)
Das “object” sagt dir nur, dass msg ein JS-Object ist. Könnte auch ein Array sein z.B.
customKey ist in msg.customKey. msg.object ist undefined, weil es den key nicht gibt im dem Object. ![]()
solltest du das noch brauchen, hier ist meine HTTP API die ist aus 2.0.7 kopiert. und heißt deswegen userflow
HTTP API.json (237,3 KB)
mit dem customKey muss ich mir dann mal aunschauen, die Seite aus 2.0.9 existiert ja noch ![]()
Danke! Ich hab mir sowas gedacht, aber einfach nicht gefunden ![]()
Auch dir danke @ahtdf gucke ich mir mal an. ![]()
Ich hab noch ein paar Probleme mit den Custom Values.
// Enable custom data mode
global.set(“customDataForApp”, true); // must be true for data to be sent
// Define your custom key:value pairs
let key_values = {
“Test key”: “test value”,
“Another test key”: “another value”,
};
// Save the object globally so the API can include it
global.set(“customDataForApp_key_values”, key_values);
Der Beschreibung nach wird der Inject ja nur einmal aktiviert und die Variablen in das Object zu schreiben.
Anschließend wird über die API das object ausgelesen (habe nicht gefunden wo)
Nur hier ist die krux.
Schreibe ich :
“Meinen Variable Definition” : “meine Globale Variablen wo der Wert regelmäßig reingeschrieben wird”
→Habe ich in der App das auch genau so als String stehen.
Schreibe ich :
“Meinen Variable Definition” : global.get(“meine Globale Variablen wo der Wert regelmäßig reingeschrieben wird”)
→ Habe ich den Wert einmalig abgerufen und in das Object geschrieben und er ändert sich nicht mehr.
Ich hab jetzt den inject einfach auf 5sec Wiederholung gesetzt und mit global.get den Wert geholt und jedesmal neu ins object geschrieben.
Ich glaube aber so war es nicht gedacht, ich hatte zumindest angenommen das ich nur den Ort des Wertes in das Object geschrieben wird.?
Bei der App hatte ich heute das 4 von 6 Temperaturen nicht mehr angezeigt wurden, Die hatten vermutlich alle 0 Grad. Nach kurzer Zeit waren sie wieder da mit 0,1 Grad.
@Tristan
Die API checkt bei Abfrage der Home Seite die globale Variable “customDataForApp”, ist diese true wird der Inhalt der Variable “customDataForApp_key_values” geholt und mitgesendet.
In dieser wiederum stehen deine Werte, die du bei jeder Änderung aktualisieren müsstest. Du kannst dir also zum Beispiel eine Function Node setzen mit dem folgenden Inhalt:
let key_values = global.get(“customDataForApp_key_values”) || {};
key_values[“Test_key”] = “new value here”; //oder global.get(“meineAndereVariable”)
global.set(“customDataForApp_key_values”, key_values);
return msg;
Also lesen > updaten > zurückschreiben.
Das würde den key “Test_key” aktualisieren oder neu setzen, falls noch nicht vorhanden. Deine Lösung mit dem 5 Sekunden Trigger macht ja im Prinzip genau das, die eigentliche Variable ständig aktualiseren.
Alles klar. So hatte ich es inzwischen bei den Switch es auch gemacht, kannte das object nicht.
Werde das dann dementsprechend anpassen, sonst holt er sich ja jedesmal alle Werte, oder kann es dabei dazu kommen wenn ich das object von verschiedenen Stellen beschrieben, das Daten dann überschrieben werden ?
Hab mehrere function Nodes, die verschiedene Variablen füllen. Ich hole mir ja immer das ganze object und ander einen werte, muss aber doch alle Werte zurückschreiben?
Du holst dir zwar immer das ganze Object, aber du änderst darin nur einen einzelnen Key und schreibst dann das Object wieder zurück.
key_values[“Test_key”] = “neuer Wert”;
überschreibt nur diesen einen Key wenn er existiert oder legt ihn neu an, alle anderen Keys im Object bleiben unverändert erhalten.
Wenn mehrere Nodes das Object gleichzeitig schreiben, kann es theoretisch passieren, dass eine Node eine alte Version des Objects zurückschreibt und dabei die Änderung der anderen Node überschreibt (Race Condition).
Wenn du aber im Object, auf das letztendlich die API zugreift nur mit Variablen arbeitest, dann reicht es ja, wenn du immer nur diese Variablen aktualisierst und dann wie du es schon hast einfach regelmäßig das komplette Object aktualisierst.
Ansonsten habe ich da aber auch eine Idee, wie wir die Variablen direkt beim API-Call live auflösen könnten, dafür müssten wir aber das Object anders schreiben, sodass wir mitgeben, dass es eine Variable ist die live aufgelöst werden muss, so in der Art:
key_values = {
"hierIstEineVariable": { type: "global", key: "meineVariable" },
"Fixer String": "Test String"
}
Dann könnten wir im API Call einfach prüfen ob der type mit angegeben wurde und wenn das der Fall ist holen wir uns live den Wert global.get(“meineVariable”). Und wenn kein type mit angegeben ist, nehmen wir einfach das was da bereits drin steht.
Kann mir aber gut vorstellen, dass das etwas too much ist für diesen Fall ![]()
Dann könnten wir im API Call einfach prüfen ob der type mit angegeben wurde und wenn das der Fall ist holen wir uns live den Wert global.get(“meineVariable”). Und wenn kein type mit angegeben ist, nehmen wir einfach das was da bereits drin steht.
Kann mir aber gut vorstellen, dass das etwas too much ist für diesen Fall
gefällt mir ![]()
Grundsätzlich funktioniert es mit dem trigger aber auch erstmal gut.
Muss eh noch ein paar dinge umbauen, bsw das ihc bei den switches auch erst das object hole und ergänze, statt es zu schreiben. Sonst würden sich die Variablen immer wieder überschreiben, wenn eine den Flow bei sich einsetzt und eigene Switches/Uservariablen nutzen würde ![]()
Auf die Gefahr hin, dass die Frage schonmal von mir gestellt war. Kann ich die HTTP API irgendwie aufbohren (Also lässt die APP das zu) um mehr Temp sensoren als solche zu bekommen ?
Ich habe jetzt die globalen Variablen einfach selber beschrieben (DS18b20 bzw Ruuvi), da ich nur so bspw. die von der Webasto gemessene Temperatur auch in der Heater Seite der APP angezeigt bekomme.
Ja kannst du, in der HTTP-API oben bei den generellen Endpunkten in der function Node “get heater stats”. Dort hast du in den Zeilen 38-58:
msg.payload = {
"temp1": {
"state": global.get("temp1").toString() === "N/A" ? "0" : global.get("temp1").toString(),
"name": global.get("Ntemp1"),
"type": "ds18b20"
},
"temp2": {
"state": global.get("temp2").toString() === "N/A" ? "0" : global.get("temp2").toString(),
"name": global.get("Ntemp2"),
"type": "ds18b20"
},
"temp3": {
"state": global.get("temp3").toString() === "N/A" ? "0" : global.get("temp3").toString(),
"name": global.get("Ntemp3"),
"type": "ds18b20"
},
"temp4": {
"state": global.get("temp4").toString() === "N/A" ? "0" : global.get("temp4").toString(),
"name": global.get("Ntemp4"),
"type": "ds18b20"
}
};
Du kannst das jetzt einfach erweitern, z.B.:
"temp5": {
"state": "12",
"name": "temp5",
"type": "ds18b20"
}
Dann zeigt die App das mit an auf der Temp Seite. Wenn du die Werte auf der Home Seite haben willst müsstest du aber auf die vorhandenen Variablen schreiben, die sind in der App hardgecoded und können auch nicht erweitert werden
Genau das habe ich gesucht! ![]()
Hab das so ergänzt, nur leider läd der Heater Tab in der APP jetzt nichtmehr.
"temp5": { "state": global.get("temp5").toString() === "N/A" ? "0" : global.get("temp5").toString(), "name": global.get("Ntemp5") || "Temp Sensor 5", "type": "ds18b20" }
Häng mal ein debug dahinter, wenn da was mit undefiniert steht funktioniert nix mehr, eventuell der Name
Dad hatte ich, ich hatte die Sensoren von der Truma auf ruvitac gelegt, aber mit dem Namen hatte nicht funktioniert = undefiniert und nix kam
tatsächlich war es so ![]()
Ich hatte zwar die Variablen in meinem Flow intergiert, diesen aber nie gestartet, sodass sie nicht existiert haben.
Habe jetzt einen Init der diese einmal auf 0 schreibt beim start (bei 0 werden diese überigens nicht angezeigt in der APP). Ein String lässt sich nicht anzeigen.
Sobald ich die Heizung starte, poppt der vierte Wert dannn auf, absolut genial.
Ich hab in der App noch ein Bug endeckt.
Wenn man auf Autotherm nach unten zieht zum aktualisieen, springt der Regler zurück auf Generic, der Tab bleibt aber auf Autotherm stehen. Man muss dann einmal nach links und wieder nach rechts wischen.
Auch verschwinden andere Temp werte aus der app wenn sie “0” sind (in dem Fall halt wirklich) ![]()
Lässt sich das aktivieren, das die App solange sie geöffnet ist, die Werte sekündlich aktuallisiert ? aktuell debugge ich viel, und da ist das praktisch die Werte live zu sehen (Heizung, Uservariablen)
Mir ist noch etwas aufgefallen.
Wenn man das System neu startet (bspw aus der Ferne) und am Display nicht auf den “einschalt” Button drückt. Dann verbraucht das Display kontinuierlich ca. 2 Watt mit voller Hintergrundbeleuchtung.
Natürlich nicht am Display direkt gemessen, sondern über den Gesammtverbauch gesehen. Sobald man das antippt und das Display dann in den Standby geht, ist der Verbrauch weg. ![]()
Vllt kann man da nen Timeout einbauen.
Gute Idee, ist mir auch schon aufgefallen. Timeout wäre super. ![]()