Klax 2.0 SML-Sensor (Übermittlung über ttn) in IPS einbinden?

Hallo zusammen,

ich bin noch am testen von IPS und dadurch am schauen, ob ich meine Basteleien mit ttn und nodered auf IPS umziehen kann.

Ich nutze einen Klax2 um meinen Stromzähler im Keller per ttn auszulesen.
ttn ist kein Problem, das habe ich in ips schon hinbekommen.
Aber die Auswertung der empfangenen Daten ist das komplizierte dabei.
Und da wollte ich mal fragen, ob evtl. jemand das schon umgesetzt hat?

Der Klax2 sendet alle x Minuten (das lässt sich einstellen) Daten, die vier Zählerstände enthält, die jeweils zu einem viertel der x Minuten erfasst wurden.
(Beispiel: Datenübermittlung alle 20 Minuten, gibt dann Zählerstände alle 5 Minuten)
Die 4 Zählerstände müssten dann aber auseinander genommen werden und mit den errechneten Zeitpunkten wann die Zählerstände erfasst wurden versehen werden, um dann in die Erfassung aufgenommen zu werden.
(Beispiel: Wenn um 20:05 Uhr vier Zählerstände übermittelt werden, dann sind in dem Datenpaket die Zählerstände von 19:50, 19:55, 20:00 und 20:05 (Wenn der Sendeintervall 20 Minuten ist))

Da ich mich noch nicht mit IPS auskenne was und wie man da Daten verarbeiten kann, frage ich hier mal, wie man das evtl. anstellen könnte.

Grüße,
Oliver

Wir haben im Store das SML Modul vom @Silberstreifen. Evtl. Könntest du es anpassen sodass es deine Werte ebenfalls auswerten kann. Oder vielleicht es auch eine Option dass du auf den Tibber Puls wechselst der damit kompatibel ist. Oder einen anderen Lesekopf.

paresy

Andere Leseköpfe mit WLAN, kann ich nicht nutzen, da ich im Mehrfamilienhaus keine WLAN Verbindung vom 4 Stock bis in den Keller bekomme. Deswegen die Nutzung von ttn über LoraWAN
Ich werde mir mal das SML Modul anschauen.

1 „Gefällt mir“

Kannst du ggf. Einen Dekoder in TTN hinterlegen sodass auf MQTT direkt schöne Daten raus kommen?

paresy

Ich habe mir das eben mal angeguckt. So wie ich das verstehe, liefert der Klax ein komplett eigenes Format, das mit SML nichts mehr zu tun hat. Da wird mein Modul wenig bringen. Auf welchem Weg bindest du heute den Klax an nodered an. Gibt es da eine Schnittstelle, die man auch in IP-Symcon nutzen kann? Wie sehen die Schnittstellendaten aus TTN aus?
Grüße
Jürgen

Aktuell frage ich mit nodered, die mqtt Daten bei ttn ab und teile mit nodered die Daten auf und habe mir das mit den 4 Zeiten für die 4 Zählerstellen gebastelt, was dann in eine Influxdb wandert, was dann später mit Grafana angezeigt wird.

Wie ich vorhin rausgefunden habe, hat @firebuster 2020 schon mal eine Idee für eine Umsetzung im Thread geschrieben.
PHP Script ist Neuland für mich, da blicke ich nicht durch und tue mich schwer.

Wie ich das lese, installierst du das Modul, konfigurierst es und bist fertig. Da brauchst du keine PHP-Kenntnisse.
Ansonsten ist PHP eine eher leicht zu lernende Programmiersprache zumal sie im Netz extrem gut dokumentiert ist. Und dann gibt es ja auch noch dieses super Forum, wo du Tag und Nacht Support bekommst.
Grüße
Jürgen

Das Problem ist, dass die Daten die über mqtt ankommen, zu sehr verschachtelt für das Modul sind und genau die Payload Daten mit dem Zählerstand nicht als Variable(n) angelegt werden.
Ich habe mir die vier Werte über ein Skript rausgeholt. Aber ich setze erstmal nur den letzten Zählerwert in eine Variable. Schon mal besser als nichts. :wink:

$data = TTN_GetData(58759);
$header = $data->uplink_message->decoded_payload->header;
$batteryPerc = $header->batteryPerc;
$msgInfo = $data->uplink_message->decoded_payload->msgInfo;
$payloads = $data->uplink_message->decoded_payload->payloads;
[, $register] = $payloads;
$values = $register->register->values;
[$value4, $value3, $value2, $value1] = $values;
$zaehler1 = $value1->value;
$zaehler2 = $value2->value;
$zaehler3 = $value3->value;
$zaehler4 = $value4->value;
SetValue(52431, $zaehler4);```

Jetzt ist die Frage, wie funktioniert die Archivierung der Daten, aus denen die Graphen erstellt werden?
Kann man auch Werte mit bestimmten Zeitstempeln in diese Archivierung einfügen?
Denn dann könnte ich $zaehler1 mit Zeitstempel z.B. 20:00, $zaehler2 mit Zeitstempel z.B. 20:05, $zaehler3 mit Zeitstempel z.B. 20:10 und $zaehler4 mit Zeitstempel z.B. 20:15 in die Archivierung schreiben und dann habe ich diese Daten auch für die Auswertung.

Du kannst mit value[0] auch direkt das erste Element aus dem Array aufrufen. :wink:

Für die Archivierung einfach bei der variable auf bearbeiten und dann archivieren anklicken :wink:

Werde ich mir mal anschauen, je kürzer Skripte sind um so besser, oder?

Schon klar, aber dann habe ich ja nur den einen Wert archiviert.
Ich würde aber gerne die vier Werte mit dem errechneten Zeitstempel archivieren um dann mehr Genauigkeit zu bekommen.

Natürlich sollte man unnötige Rechenoperationen vermeiden aber im allgemeinen geht es eher um die Übersichtlichkeit :wink:

Mit der Funktion AC_AddLoggedValues() kann man Variablem mit einem Zeitstempel ins Archiv schrieben.
Doku
Danach muss die Funktion AC_ReAggregateVariable() aufgerufen werden um die Variablen im Archiv zu sortieren.
Doku

@paresy

  • kann man im Modul auch die AC_Funktion zum Scheiben einer Variable verwenden oder Widerspricht das den Modulregeln bzw. der Vorgehensweise mit $this->SetValue() der Statusvariablen?

  • Gibt es Probleme wenn man das reaggregieren so häufig verwendet?

Habe es jetzt hinbekommen, die vier Zählerwerte ins Archiv zu bekommen.
Bestimmt geht das noch eleganter, aber fürs erste funktioniert es jetzt mal.

<?php

$data = TTN_GetData(58759);
$header = $data->uplink_message->decoded_payload->header;
$batteryPerc = $header->batteryPerc;  //Batterie Status 
SetValue(24810, $batteryPerc);
$rx_metadata = $data->uplink_message->rx_metadata;
[$rx_metadata2,] = $rx_metadata;
$timestamp4 = $rx_metadata2->timestamp;
$interval = 5;  //Messintervall der im Klax2 eingestellt ist
$time4 = $rx_metadata2->time;
$timestamp4 = strtotime($time4);
$timestamp3 = $timestamp4 - ($interval * 60);
$timestamp2 = $timestamp4 - (2 * ($interval * 60));
$timestamp1 = $timestamp4 - (3 * ($interval * 60));

$msgInfo = $data->uplink_message->decoded_payload->msgInfo;
$payloads = $data->uplink_message->decoded_payload->payloads;
[, $register] = $payloads;

$values = $register->register->values;
[$value4, $value3, $value2, $value1] = $values;
$zaehler1 = $value1->value;
$zaehler2 = $value2->value;
$zaehler3 = $value3->value;
$zaehler4 = $value4->value;


AC_AddLoggedValues(59946, 52431, [
    [
      'TimeStamp' => $timestamp1,
      'Value' => $zaehler1
    ],
    [
      'TimeStamp' => $timestamp2,
      'Value' => $zaehler2
    ],
    [
      'TimeStamp' => $timestamp3,
      'Value' => $zaehler3
    ]
  ]);
AC_ReAggregateVariable(59946, 52431);
SetValue(52431, $zaehler4);

?>