[Modul] TheThingsNetwork

Hallo,

ich habe grade ein neues Device in meinen TTN-Stack eingebunden (sensative strips). Einbindung in TTN einwandfrei, wird auch über den TTN Konfigurator erkannt und per MQTT in Symcon angelegt. Problem: die Payload kommt anscheinend in einem merkwürdigen Format rüber, so daß nicht alle Variablen angelegt werden.

Debug vom MQTT-Device:

31.01.2024, 15:52:13 | HandleReceivedData() | Payload: {"door":{"value":false},"historySeqNr":65535,"prevHistSeqNr":65535}
31.01.2024, 15:52:13 | HandleReceivedData() | Key: door Value: stdClass Object<LF>(<LF>    [value] => <LF>)<LF> Type: object
31.01.2024, 15:52:13 | HandleReceivedData() | Key: historySeqNr Value: 65535 Type: integer
31.01.2024, 15:52:13 | HandleReceivedData() | Key: prevHistSeqNr Value: 65535 Type: integer

Da kommen auch noch ein paar andere Werte, mir geht’s aber hauptsächlich um den Wert von „door“. Was kann ich tun, um da weiterzukommen?

Viele Grüße

Dirk

Das Modul unterstützt keine verschalten Variablen bzw. Objekte.

Lösungsansatz Nr1:
Du änderst den Payload-Decoder in TTN so um, dass die Objekte in Payload auf einer Ebene sind.

Lösungsansatz Nr.2:
Du schaltest das automatische erstellen der Variablen aus und liest die Objekte im Payload mit einem Script selbstständig aus:

<?php
$data = TTN_GetData(12345);
$door = $data->uplink_message->decoded_payload->door->value;

Das Skript kannst du mit einem Event auf eine Aktualisierung einer Statusvariable der Instanz triggern.

Lösungsansatz Nr.3:
Du Implementierst eine Instanz für das Gerät und machst einen Pull-Request :grin:

Danke, das hat geholfen. Um alles auf einmal auslesen zu können, musste ich nur noch den Türsensor in eine Reportgruppe mit den anderen Werten schieben. Leider reicht mein php nicht aus, um rauszufinden, ob ein Objekt in den Daten vorhanden ist oder nicht. So geht’s aber.

Viele Grüße
Dirk

Ob ein Element vorhanden ist kannst du einfach überprüfen:


<?php
$data = TTN_GetData(12345);

if (property_exists($data->uplink_message->decoded_payload, 'door')
{
if (property_exists($data->uplink_message->decoded_payload->door, 'value')
{
SetValue(23456, $data->uplink_message->decoded_payload->door->value);
}
}

Einfach mit mehren if-Abfragen verschachteln um sich nach innen zu hangeln.

Ist zwar optisch nicht soooo schön aber funktioniert :wink:

(Ich hoffe das passt so … habe ich jetzt nur schnell auf dem Handy zusammen gestöpselt und nicht getestet :wink:)

Grandios! Ich hab mir grade die Payload angeschaut, nachdem ich den Türsensor eingebaut hatte. Kommt leider nur, wenn die Tür tatsächlich auf- oder zugeht. Deshalb brauch ich den Codeschnipsel mit property_exists. Danke für den php-Kurs :slight_smile:

Viele Grüße

Dirk

1 „Gefällt mir“

Hallo ich finde das Thema TTN auch sehr interessant und habe mir zu Studienzwecken einen dieser mittlerweile sehr günstigen Browan/MerryIoT V1 Helium Miner zugelegt, welcher ja in der Lage ist einen zweiten LoRaWAN Gatewayserver bereitzustellen. Dazu einen LoRaWAN Pushbutton PB01 vom Hersteller Dragino. Ich habe es auch geschafft, den in der TTN Console einzubinden.

In IP -Symcon werden mir allerdings nur MQTT Daten präsentiert, die mir nicht viel nützen - angeblich soll der Taster ja auch einen eingebauten Temperatur-und Feuchtigkeitssensor besitzen. Ich wäre aber auch schon zufrieden mit einer Variable des Taster-Zustandes. Liegt es daran, weil das Teil noch nicht offiziell im TTN Repository geführt ist? Oder sind noch andere Schritte in TTN notwendig. Vielleicht hat ja jemand mehr Ahnung wie ich … :sweat_smile:

Du musst im TTN Stack sagen, wie dieser die Rohdaten interpretieren soll.

„Payload-Decoder“ ist das Zauberwort :wink:

Hier wirst du fündig:

1 „Gefällt mir“

Dachte mir schon, dass es an der Sache einen Haken gibt. :sweat_smile:

Habe den Code für das Gerät in TTN unter „Payload formatters“ und dann „Custom javascript formatter“ abgespeichert und schon waren beim nächsten Betätigen des Buttons alle Daten da …

So einfach, wenn man weiss, wie es geht … Danke Dir! Hätte ich ewig rätseln können :joy:

1 „Gefällt mir“

Ließe sich das dahingehend umbauen?

Ist nicht so ohne.
Müsste mal schauen wie es in anderen Modulen gelöst ist.
Ein Baum innerhalb einer Instanz ist aber auch nicht so gedacht.

Okay. Ich habe mir erstmal mit deinem Vorschlag geholfen. Funktioniert…

Genau dafür ist die Funktion ja da.
Es wird immer Dinge geben, die mit dem Modul alleine nicht funktionieren. Das kann alleine schon sein wenn ein Boolscher Wert als 1 und 0 übergeben wird und er somit automatisch als Integer angelegt wird.
Auch wenn ganze Objekte übergeben werden kommt man einfach nicht drum herum da selbst was zu sticken.
Alternativ gibt es auch die Möglichkeit sich eine eigene Instanz für das entspreche physische Gerät zu bauen, die ich dann ins Modul wieder einfließen lasse.

Hallo zusammen,
bei mir scheitert es leider schon eher. Ich Zweifel schon an mir.

Ich versuche den Client Socket mit TTN zu verbinden, bekomme aber immer den Fehler:
„Der angegebene Host ist unbekannt. (Code: -32603)“.

Ich probiere es mit der Eingabe der Public adress von meinem TTN „Integrations“:
„eu1.cloud.thethings.network“ und als Port 1883.

Kann mir vielleicht einer sagen was ich unter Host genau eingeben muss?

Danke im Voraus.

Grüße
Holger

In der freien Community-Version von TTN ist es „eu1.cloud.thethings.network“ und in der kommerziellen Version „eu1.cloud.thethings.industries“. Der Port ist in beiden Fällen 8883. „Benutze SSL“ und „Überprüfe Host“ anschalten, „Überprüfe Peer“ nicht anschalten. Wenn keine Firewall blockt, sollte es OK sein.

grafik

2 „Gefällt mir“

Hallo zusammen,

danke eure Antworten. Es hat mir sehr geholfen zu wissen, wie es ausgefüllt werden muss. Ich habe inzwischen meinen Fehler gefunden. Beim Host hat sich vor der Adresse noch ein Leerzeichen eingeschlichen. Außerdem war mein MQTT Client noch falsch konfiguriert und deswegen hat der Client Socket einen Fehler gebracht.

Jetzt geht alles.

Danke für eure Unterstützung.

Grüße
Holger

2 „Gefällt mir“