[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“