NEWS
Über einen Datenpunkt aus API lesen & an API schreiben?
-
Hallo zusammen,
Ich hänge irgendwie fest und komme nicht mehr weiter. Ich frage mit folgendem Script über die Smarthings API von Samsung den Status meiner Klimaanlage ab und schreibe ihn in Datenpunkte:
Auf die gleichen Datenpunkte habe ich in einem zweiten Script einen Trigger gesetzt, sodass bei einer Änderung der Datenpunkte diese wieder an die Klimaanlage geschickt werden, um die Anlage z.B. anzuschalten oder auszuschalten:
Nun habe ich das Problem, dass wenn ich zufällig in dem Augenblick versuche die Anlage über den Datenpunkt einzuschalten, wenn die Daten von der Anlage gelesen werden, die Anlage nicht angeht und meine Änderung des Datenpunkts einfach überschrieben wird.
Wie kann ich das so aufsetzen, dass meine Änderung nicht automatisch überschrieben wird sondern tatsächlich an die Anlage geschickt wird? Ist wahrscheinlich eine Anfängerfrage, aber irgendwie konnte ich mir die Lösung nicht ergoogeln. Mache ich da einen kapitalen Denkfehler?Ich schalte die Klimaanlage mit einem weiteren Skript an und aus, je nachdem ob die Photovoltaik gerade genug Strom produziert oder nicht. Dabei kommt es immer wieder vor, dass die Anlage nicht korrekt ein oder wieder ausgeschaltet wird. Gerade das "vergessene" Ausschalten könnte aber teuer werden und das würde ich gerne in Zukunft vermeiden. Zur Vollständigkeit hier noch einmal mein Skript zum automatischen an und ausschalten:
Ich bin für jeden Tipp dankbar!
Beste Grüße
-
@maximilian-garbe sagte: Status meiner Klimaanlage ab und schreibe ihn in Datenpunkte:
Die Abfragen sind überflüssig: Aktualisiere die 8 Datenpunkte alle 10 s.
@maximilian-garbe sagte in Über einen Datenpunkt aus API lesen & an API schreiben?:
bei einer Änderung der Datenpunkte diese wieder an die Klimaanlage geschickt werden
Anstelle des RegExp verwende einzelne Trigger. Beispiel:
on({id: '0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur', change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) {
verhindert Triggern, wenn die Quelle ein Skript ist.
@maximilian-garbe sagte in Über einen Datenpunkt aus API lesen & an API schreiben?:
Skript zum automatischen an und ausschalten:
Hier sollte auf "0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.kurzfristig_Mittelwert_Stromeinspeisung/-Bezug" getriggert werden.
Worin unterscheiden sich die Datenpunkte?- "0_userdata.0.Klimaanlagen.Schlafzimmer.Switch"
- "0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_An"
- "0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_aus"
Ein Datenpunkt sollte zum Ein-/Ausschalten genügen. Modus und Sollwert werden beim Ein-/Ausschalten nicht verändert.
Eine Hysterese von 100 W ist viel zu klein. Sie muss größer sein als die Leistungsaufnahme des leistungsstärksten Gerätes, sonst wird im Grenzbereich alle 2 Minuten ein- und ausgeschaltet. -
@maximilian-garbe sagte: bei einer Änderung der Datenpunkte diese wieder an die Klimaanlage geschickt werden, um die Anlage z.B. anzuschalten oder auszuschalten:
Ich würde das Senden des Kommandos in eine Funktion sendCmd(cmd) packen. Das NPM-Modul "follow-redirects" kenne ich nicht und habe mich deshalb an Dein Skript gehalten.
Zum Ein-/Auschalten kann man das Ack-Flag auswerten, das im ersten Skript gesetzt wird und im Ein-/Ausschaltskript nicht:on({id: '0_userdata.0.Klimaanlagen.Gästezimmer.Switch', change: 'ne', ack: false}, function (dp) { sendCmd({ component: "main", capability: "switch", command: "switch", arguments: [dp.state.val ? 'on' : 'off'] // boolean --> string }); });
Muss hier nicht auch der Wert "on" bzw. "off" in arguments[0] übergeben werden?
-
@paul53
Vielen Dank erstmal für deine ausführliche Antwort und deine Mühe. Das hat mir sehr geholfen und ich verstehe jetzt deutlich besser die Triggerfunktion.@paul53 said in Über einen Datenpunkt aus API lesen & an API schreiben?:
Die Abfragen sind überflüssig: Aktualisiere die 8 Datenpunkte alle 10 s.
So hatte ich es tatsächlich auch die ganze Zeit. Die Abfragen waren zuletzt ein sehr verzweifelter Versuch meine Probleme in den Griff zu kriegen
Anstelle des RegExp verwende einzelne Trigger. Beispiel:
on({id: '0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur', change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) {
So habe ich es nun umgesetzt und funktioniert gefühlt zuverlässiger. Wollte ich schon länger machen, aber war zu faul ^^
verhindert Triggern, wenn die Quelle ein Skript ist.
Der Trigger soll auch über Skripte ausgelöst werden. Daher habe ich das fromNE: weggelassen
Worin unterscheiden sich die Datenpunkte?
- "0_userdata.0.Klimaanlagen.Schlafzimmer.Switch"
- "0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_An"
- "0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_aus"
Hatte mit automatisch an und automatisch aus versucht eine Logik zu bauen, um zu erkennen, ob die Klimaanlagen manuell über die Fernbedienung oder die vis bedient wurden. In diesem Fall sollen die Anlagen nämlich nicht mehr automatisch an oder ausgehen.
Eine Hysterese von 100 W ist viel zu klein. Sie muss größer sein als die Leistungsaufnahme des leistungsstärksten Gerätes, sonst wird im Grenzbereich alle 2 Minuten ein- und ausgeschaltet.
"kurzfristig_Mittelwert_Stromeinspeisung/-Bezug" ist über eine Minute gemittelt und "Mittelwert_Stromeinspeisung/-Bezug" ist über 10 Minuten gemittelt. Dadurch waren es nicht ganz alle 2 Minuten, aber je nach Wolkengrad schon alle 10 Minuten. ich habe das mal ein wenig erhöht.
@paul53 said in Über einen Datenpunkt aus API lesen & an API schreiben?:
@maximilian-garbe sagte: bei einer Änderung der Datenpunkte diese wieder an die Klimaanlage geschickt werden, um die Anlage z.B. anzuschalten oder auszuschalten:
Ich würde das Senden des Kommandos in eine Funktion sendCmd(cmd) packen. Das NPM-Modul "follow-redirects" kenne ich nicht und habe mich deshalb an Dein Skript gehalten.
Genauso habe ich es jetzt umgesetzt:
var fs = require('fs'); // wofür?
Das war ein Relikt
on({id: '0_userdata.0.Klimaanlagen.Gästezimmer.Switch', change: 'ne', ack: false}, function (dp) { sendCmd({ component: "main", capability: "switch", command: "switch", arguments: [dp.state.val ? 'on' : 'off'] // boolean --> string }); });
Muss hier nicht auch der Wert "on" bzw. "off" in arguments[0] übergeben werden?
Das ist so eine Eigenart der Smartthings API. Für einige Funktionen wird der Value an Command übergeben wie bei switch und bei anderen kommt der in die Argumente. Nicht wirklich eingängig leider. Das Displaylicht kann man zum Beispiel nur per Befehl ein und ausschalten. Es gibt aber keine Möglichkeit den aktuellen Status des Displaylichts abzufragen.
Hier noch einmal der Vollständigkeit halber mein mit deinen Tipps optimiertes Skript zum
Automatisch Ein- und Ausschalten:
Nochmal besten Dank!
Jetzt muss nur die Sonne wieder scheinen, damit ich die angepassten Skripte auch mal testen kann
-
@the-masterplan sagte: optimiertes Skript zum Automatisch Ein- und Ausschalten:
Die Hysterese erscheint mir immer noch zu klein. Du musst bedenken, dass bei Zuschalten eines Klimagerätes die Einspeisung um die Leistungsaufnahme des Gerätes zurück geht. Es soll ja im Grenzbereich der Einspeisung nicht nach kurzer Zeit wieder ausschalten.