NEWS
Wie "pollt" ein Adapter neue Werte ?
-
Hallo,
es scheint als ob man zwei Möglichkeiten hat:
-
Im Hauptprogramm (main.js) ein setInterval() setzen mit dem regelmässig ein "pollen" stattfindet.
-
Im io-package.json den "mode" auf schedule setzen.
Gibt es noch andere Möglichkeiten?
Steve
-
-
Ich wis nicht so richtig was du meinst ? Kommunikation innerhalb iobroker, als ziwschen controller und Adapter sollte event orientirt laufen also über soket.io (subscripe)
Adapter werden nicht aufgerufen sondern einmal gestartet dann laufen sie selbstständig.
-
Hallo SmilingJack,
die Frage die sich mir stellt ist: "Wie kann ich es triggern das ein Adapter regelmässig Werte (Temperatur) ausliest?" Diese Werte befinden sich in einer Public Cloud mit einer REST API (https://spark.io/…) . Ich habe gesehen das der OWFS Adapter wohl "timer = setInterval(pollAll, adapter.config.interval * 1000);" nutzt.
Wie man einen AJAX ($.get) Aufruf macht weiss ich schon…obwohl anscheinend manche Adapter über einen Socket (socket.emit('httpGet'...) gehen. Aber das ist eine andere Frage.
Danke
Steve
-
Wie man es am besten macht hänt von dem Interval und der Verbindung ab. Wenn du nur alle paar sekunden oder länger pollen wilst kanst du gut mit setintervall arbeiten. Ist auch ok
Wenn es aber schneller sein soll würde ich es nicht so machen ist zu riskant das der nächste intervall schon kommt obwohl der eine noch nicht fertig ist.
Beim S7 adapter habe ich es grade so gemacht
function poll(){ // hier den code zum pollen und schreiben in iobroker setTimeout(poll(),500); } poll();
der Nachtei ist das das pollen jetzt keinen festen intervall hat bei mir schwankt die Zeit die für das Pollen und Verarbeiten benötigt wird 40-80ms im normal fall. Wenn ich allerdings am Rechner von dem ich polle was mache dann kann es auch mal 200-600ms dauern. Dazu kommen dann immer die 500ms warte zeit. Aber ist ist halt recht sicher.
-
Morgen,
danke für die detailierte Antwort, werde also erstmal mit setinterval probieren.
Bei deinem Beispiel ist mir eins nicht klar…dies ist doch ein einmaliger Vorgang, d.h. mit 500ms Verzögerung wird die Funktion poll() aufgerufen und dann nie wieder? Werd' mir gleich mal S7 genauer ansehen.
Was hältst du von der Scheduler Möglichkeit? Scheint mir sehr an den UNIX Scheduler angelehnt zu sein. Ist wohl zu langsam?
Danke
Steve
-
Hi SmillingJack,
gerade mich mal schlau gemacht. Also mit S7 ist nicht eine russische Fluggesellschaft gemeint sondern eine gute alte Simatic. Aber Simatic und ioBroker? Meine letzte Erfahrung mit Simatic 20 Jahre her (KOP).
Code:
- Ich sehe in Deinem Code nicht (auf die Schnelle) wie hier ein Loop stattfindet. Es scheint mir ein einmaliger Aufruf…moment (gerade noch mal reingeschaut) ...machst du hier einen rekursiven Aufruf von poll() in poll()? Aber warum ein rekursiver Aufruf von poll() mit und ohne setTimeOut()?
Bis dann
Steve
-
Es hängt alles vom Zykluszeit ab. Falls die Info in sekunden/einige Minuten Bereich liegt, dann ist es besser setInterval zu benutzen.
Falls 5 Minuten und mehr dann scheduler Modus benutzen.
Falls weniger Sekunden oder sogar ms Bereich, dann setTimeout mit widerholten Aufruf.
Was für ein Zyklus hast du?
-
Hallo Bluefox,
dachte Du bist im Urlaub ohne Strom?
Bei mir geht es erstmal um das Auslesen von Temperatur und Luftfeuchtigkeit, ich denke hier muss ich nicht im ms Bereich abrufen. Aber wie gesagt der Spark Core kann mehr…
Schöne Ostern im Kreis der Familie
Steve
-
Wenn es um Temperatur geht, dann sicherlich 3 Minuten Pollzeit? Oder?
Machst du noch irgendwas beim Start ausser die Werte lesen? Z.B. Datenpunkte anlegen komplizierte Kommunikation aufbauen?
Falls ja, mache setInterval, falls nicht, dann schedule - mode, wie dwd und yr.
-
Moin, Moin,
es kommt immer anders als man denkt…eigentlich müssten alle von uns die asynchrone Calls machen, ein Problem mit der Response Time haben?
REST Aufruf in die Spark Cloud:
- Es hat sich herausgestellt das ein fixes "pollen" (z.B. alle 3 sek) keinen Sinn mach, da der AJAX Aufruf asynchron ist und ich nicht weiss ob
er 1 Sekunde oder 1 Minute (oder länger) dauert. Ist das nicht schon eine "Race Condition"…man weiss nicht welcher Call zuerst zurück kommt?
- Die AJAX Aufrufe muss ich einer nach den anderen machen, soll heissen erst die Spark Device holen (1. GET) und dann Ihren Status (2. GET). Also
hier habe ich auch noch eine bestimmte Reihenfolge.
==> Werde wohl daher wohl mit jQuery Promises arbeiten müssen.
@All: Wie macht Ihr das?
Thx
Steve