Umgang mit Variablen-Import aus externer Quelle(AC_AddLoggedValues vs. SetValueFloat)

Hallo zusammen,

ich bin gerade dabei ein Modul für meinen Pool-Tester (Water-i.d. Poollab) zu schreiben das die gemessenen Werte (pH, Chlor, etc) aus deren Cloud-Datenbank abfragt und in Symcon ablegen soll. Da ich die Werte über eine API mit dem zugehörigen Zeitstempel erhalte, möchte ich diesen natürlich auch in Symcon übernehmen.

Aktuell schreibe ich die Werte über AC_AddLoggedValues mit dem jeweiligen Timestamp in den Archive-Control, allerdings ist die Float-Variable dann in der Pro-Console immer noch auf dem Default-Wert von 0.0 und das Feld „last changed“ steht auf never. Wenn ich die Werte über SetValueFloat schreibe kann ich jedoch den Timestamp nicht beeinflussen und verfälsche somit die Graphen.
Ist mein Vorgehen über AC_AddLoggedValues das richtige oder gibt es eine bessere Variante?

Zusätzlich ist mir aufgefallen, dass ich mir die archivierten Werte bei einer „nie geschriebenen“ Variable in der Pro-Konsole nicht ansehen kann. Wenn ich mir die archivierten Werte über die Pro-Console ansehen möchte erscheint die Meldung „This Variable was never changed. Thus, no logged data is available.“ obwohl ich im Dateisystem die CSV-Dateien mit den korrekten Werten sehe.
Ist das Verhalten der Pro-Console ein Bug? In der Legacy-Konsole sehe ich die alten Werte und auch die CSV-Dateien sehen unauffällig aus.

Schönes Wochenende,
Bernd

Hallo
Wenn die Funktion AC_AddloggValues benutzt musst du jedesmal
im Script Reaggretiern damit alles stimmt.

Gesendet von iPad mit Tapatalk

Hi,

Den Hinweis in der Doku habe ich gesehen, aber selbst ein Reaggregieren nach jedem Einfügen ändert leider nichts am Verhalten. Fehlermeldungen tauchen auch keine auf, die Reaggregation läuft fehlerfrei durch.

Gesendet von meinem SM-G973F mit Tapatalk

Hast du vielleicht ein Skriptschnipsel mit dem ich das Verhalten reproduzieren kann? Eigentlich sollte die Variable nach der Aggregation funktionieren.

Übrigens ist es korrekt, dass sich die Variable nicht ändert. Mit AddLoggedValues fügst du Werte ins Archiv ein, änderst allerdings nicht den aktuellen Wert.

Moin,

gerne hier der zugehörige Ausschnitt, allerdings noch „unoptimiert“ da aktuell noch nach jedem Übertragen eines Messwertes die Re-Aggregation durchgeführt wird. Aufgrund der wenigen Werte (<10 Werte pro Variable) reicht die 1 Sekunde sleep damit die Re-Aggregation erfolgreich abgeschlossen wird.

Meine aktuelle Überlegung für das Variablen-Update wäre den aktuellsten Messert über SetValueFloat einzutragen, dann habe ich dafür zwei Werte im Archive-Handler aber immerhin, einmal zum Messzeitpunkt und einmal zum Import-Zeitpunkt. Das würde soweit passen, aber wollte nur sichergehen dass es keine schönere Variante dafür gibt.


$logged = sizeof(AC_GetLoggedValues($ACID, $variableID, $measurementTimestamp, $measurementTimestamp, 1), 0);
if ($logged == 0) {
  if ($debug) {
    IPS_LogMessage(IPS_GetName($this->InstanceID), "Adding Measurement to Archive Control.");
  }
  AC_AddLoggedValues($ACID, $variableID, [['TimeStamp' => $measurementTimestamp, 'Value' => $measurementValue]]);
  AC_ReAggregateVariable($ACID, $variableID);
  sleep(1);
}

Folgendes verbirgt sich hinter den Variablen:

[ul]
[li]$ACID => Archive Control Instanz
[/li][li]$variableID => Float-Variable für die Messwerte
[/li][li]$measurementTimestamp => Zeitstempfel des Messwertes aus externer Datenbank
[/li][li]$measurementValue => Messwert aus externer Datenbank
[/li][/ul]

Hier auch nochmal das Verhalten in den beiden Konsolen festgehalten, Legacy Konsole auf deutsch, Pro-Konsole auf Englisch falls das relevant sein sollte.

Pro-Konsole:

Legacy-Konsole:

Hi hast du es lauffähig bekommen?