NEWS
Smartmeter Adapter - neue Daten Ereignis in Javascript
-
Ich würde gerne sobald neue Daten vom Smart-Meter angekommen sind eine Berechnung durchführen.
Einen Test habe ich schon durchgeführt welcher auch klappt.
on({ id: 'smartmeter.0.1-0:2_8_0.value', change: 'any' }, function (data) { console.log(((data.state.val - data.oldState.val) * (3600000 / ((data.state.ts - data.oldState.ts)))) * 200 + ' Zeit: ' + ((data.state.ts - data.oldState.ts) / 1000)); });
Ich möchte aber auch noch eine andere Berechnung durchführen, welche mehrere Datenpunkte des Zählers benötigt.
Der Smart-Meter Adapter liest ja alle Daten auf einmal aus und schreibt diese dann in die ensprechenden Objekte.Kann ich davon ausgehen, dass bereits alle Objekte aktualisiert wurden, wenn das Ereignis im Beispiel oben auslöst?
Oder gibt es besser ein besseres Ereignis welches ich verwenden kann? (z.B. Smartmeter Adaper update abgeschlossen).@apollon77 wüsstest du hier vielleicht eine Lösung?
-
@michael-uray sagte in Smartmeter Adapter - neue Daten Ereignis in Javascript:
@apollon77 wüsstest du hier vielleicht eine Lösung?
aktuell keine echte, ausser im Debug Log zu schauen was der "letzte" Datenpunkt ist der geschrieben wird und nimmst den als Trigger und ggf machst noch nen "warte noch 200ms oder so.
-
@apollon77 said in Smartmeter Adapter - neue Daten Ereignis in Javascript:
@michael-uray sagte in Smartmeter Adapter - neue Daten Ereignis in Javascript:
@apollon77 wüsstest du hier vielleicht eine Lösung?
aktuell keine echte, ausser im Debug Log zu schauen was der "letzte" Datenpunkt ist der geschrieben wird und nimmst den als Trigger und ggf machst noch nen "warte noch 200ms oder so.
Ok danke, interessant, dass es es hier noch nichts gibt. Ich könnte mir vorstellen, dass es öfter vorkommt, dass Adapter mehrere Datenpunkte auf einmal beschreiben und dass man dann erst dann etwas durchführen möchte wenn alle States mit aktuellen Daten fertig beschrieben wurden.
Ein Lösungsansatz wäre es z.B., dass der Adapter am Ende wenn alle States beschrieben wurden das bool
smartmeter.0.info.statesUpdated
auftrue
setzt und am Beginn des nächsten Lesevorganges wird es wieder auffalse
gesetzt.
Dann könnte man dieses bool mit einem Event überwachen und so auf den Start und das Ende eines Lesevorganges reagieren.Hier noch der Vollständigkeit wegen mein aktueller Workaround, ich nehme an (hoffe), dass in 200ms alle Datenpunkte erfolgreich aktualisiert wurden nach dem das Event von einem (zufälligen) Datenpunkt getriggert wurde.
on({ id: 'smartmeter.0.1-0:2_8_0.value', change: 'any' }, function (data) { setTimeout(() => { console.log(((data.state.val - data.oldState.val) * (3600000 / ((data.state.ts - data.oldState.ts)))) * 200 + ' Zeit: ' + ((data.state.ts - data.oldState.ts) / 1000)); }, 200); // 200ms delay time for calculation after event trigger to give smart meter adapter time to update all states });
-
@michael-uray am besten und sichersten wäre es das smartmeter einen sammelstate zb mit nem json aller Daten schreibt. Dann kann man den benutzen und hat alle Daten die zusammengehören. Das ist die sicherste Lösung.
So machen es Adapter am ehesten wenn sowas gebraucht wird.
Kannst gern mal ein issue in github dazu anlegen