WLANThermo_Server im Docker

BBQ_Peter

New member
Hallo
Ich versuche den (original) Cloud Server von https://github.com/WLANThermo-nano/WLANThermo_Server/ master Branch zum fliegen zu bekommen.
Docker nutze und mag ich, und so kann es dann auch jeder Interessierter mit paar Klicks nachbauen.
Leider habe ich keine Anleitung und reverse Engineering hat seine Grenzen.
Mein Setup:
Ich habe den miniV3 und LinkV1, SW 1.2.2
Docker + Docker-Compose unter Debian
SSL habe ich noch nicht aktiviert, die Server IP ist 192.168.98.65:8080

Ich habe allerding Probleme.
Hier in Forum sind nur paar Info-Schnippsels aus 2019 wo nur darüber diskutiert, wie ein eigener Cloud-Server ins Gerät reingepatcht wird.
Bei den aktuellen Geräten gibt es das aber schon, unter IoT-Benutzerdefinierten Cloud Service aktivieren-Url
Mit dieser URL dort, schreibt der Server tatschächlich alle 30s in die DB:
Ist die einzige URL die etwas bewirkte, "serial" musste ich zufügen damit sich was tut.
Ich sehe nun die Temperaturen Einträge in der "cloud" Tabelle.
Die Tabellen "devices" und "sw_versionen" sind leer und werden nicht beschrieben.

Im Browser unter
wird die WLAN Thermo Cloud Oberfläche aufgebaut, diese ist allerdings leer.
Aber sie lebt, alle paar Sekunden wird "POST /cloud.wlanthermo.de/data.php" aufgerufen, mit result=200.

Die Logs auf dem Server geben nun keine Fehler aus.


Meine ersten Fragen:
- Was muss im Gerät unter Benutzerdefinierten Cloud Service Url wirklich eingetragen werden
- Wie tragen sich die Geräte als devices ein ?
- Im update.wlanthermo.de/gitImporter.php wird die Tabelle software_files gefüllt. Wo finde ich deren Struktur ? (create SQL)

Für den Anfang, meine docker-compose.yml, fürs kurzen Überblick.

Code:
docker-compose.yml
# Use root/example as user/password credentials
version: '3.1'

services:


  db:
    image: pv/mysql:latest
    build: ./db/mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - "/docker/WT/mysql:/var/lib/mysql"
    ports:
      - 53306:3306


  nginx:
    image: wt/nginx:alpine
    build: ./web/nginx
    ports:
      - "8080:80"
    volumes:
      - /docker/WT/www/html/:/var/www/html/
    depends_on:
      - db

  php:
    image: wt/php:fpm-alpine
    build: ./php/fpm-alpine
    volumes:
      - /docker/WT/www/html/:/var/www/html/
    depends_on:
      - db



networks:
  default:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.88.0/24
 
Zuletzt bearbeitet:

Phantomias2006

Entwickler
Teammitglied
Admin
Hi, kurz gesagt - ich denke so wird das leider nichts…
saveData.php ist noch ein Überbleibsel der uralt Nanos…

Aktuell wäre es diese API:

Nur die Cloud Funktion im GUI wird, soweit ich mich erinnere, nicht das selbe Datenformat verwenden…
@s.ochs sind die Cloud Urls im Recovery Menü änderbar?
 

BBQ_Peter

New member
Danke !
Ich habe Gerät mini (192.168.98.100) auf die URL umgestellt (http://192.168.98.65:8080/api.wlanthermo.de/index.php?serial=555&api_token=AAA)

Aber das alle 30s gesendete Json gefällt ihm nicht, Server steigt in der api.wlanthermo.de/index.php Zeile 67 aus.
checkDeviceJson($JsonArr) ist false

Code:
Im Api LOG

2023-10-31 13:51:41    [INFO ]: load ../db.class.php
2023-10-31 13:51:41    [INFO ]: IP-Adress:192.168.98.100
2023-10-31 13:51:41    [INFO ]: file_get_contents input:{"version":1,"interval":30,"channel":[{"number":1,"name":"Fleisch 1","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#0C4C88","fixed":false,"connected":false,"unit":"C"},{"number":2,"name":"Kanal 2","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#22B14C","fixed":false,"connected":false,"unit":"C"},{"number":3,"name":"Kanal 3","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#EF562D","fixed":false,"connected":false,"unit":"C"},{"number":4,"name":"Kanal 4","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#FFC100","fixed":false,"connected":false,"unit":"C"},{"number":5,"name":"Fleisch 2","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#A349A4","fixed":false,"connected":false,"unit":"C"},{"number":6,"name":"Fleisch 3","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#804000","fixed":false,"connected":false,"unit":"C"},{"number":7,"name":"Kanal 7","typ":0,"temp":null,"min":70.00,"max":250.00,"alarm":1,"color":"#5587A2","fixed":false,"connected":false,"unit":"C"},{"number":8,"name":"Kanal 8","typ":0,"temp":null,"min":70.00,"max":250.00,"alarm":1,"color":"#5C7148","fixed":false,"connected":false,"unit":"C"},{"number":9,"name":"Rost","typ":15,"temp":23.80,"min":80.00,"max":235.00,"alarm":0,"color":"#C3D69B","fixed":true,"connected":false,"unit":"C"}]}
2023-10-31 13:51:41    [ERROR]: JSON invalide
2023-10-31 13:52:11    [INFO ]: load ../db.class.php
2023-10-31 13:52:11    [INFO ]: IP-Adress:192.168.98.100
2023-10-31 13:52:11    [INFO ]: file_get_contents input:{"version":1,"interval":30,"channel":[{"number":1,"name":"Fleisch 1","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#0C4C88","fixed":false,"connected":false,"unit":"C"},{"number":2,"name":"Kanal 2","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#22B14C","fixed":false,"connected":false,"unit":"C"},{"number":3,"name":"Kanal 3","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#EF562D","fixed":false,"connected":false,"unit":"C"},{"number":4,"name":"Kanal 4","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#FFC100","fixed":false,"connected":false,"unit":"C"},{"number":5,"name":"Fleisch 2","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#A349A4","fixed":false,"connected":false,"unit":"C"},{"number":6,"name":"Fleisch 3","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#804000","fixed":false,"connected":false,"unit":"C"},{"number":7,"name":"Kanal 7","typ":0,"temp":null,"min":70.00,"max":250.00,"alarm":1,"color":"#5587A2","fixed":false,"connected":false,"unit":"C"},{"number":8,"name":"Kanal 8","typ":0,"temp":null,"min":70.00,"max":250.00,"alarm":1,"color":"#5C7148","fixed":false,"connected":false,"unit":"C"},{"number":9,"name":"Rost","typ":15,"temp":23.80,"min":80.00,"max":235.00,"alarm":0,"color":"#C3D69B","fixed":true,"connected":false,"unit":"C"}]}
2023-10-31 13:52:11    [ERROR]: JSON invalide
2023-10-31 13:52:42    [INFO ]: load ../db.class.php
2023-10-31 13:52:42    [INFO ]: IP-Adress:192.168.98.100
2023-10-31 13:52:42    [INFO ]: file_get_contents input:{"version":1,"interval":30,"channel":[{"number":1,"name":"Fleisch 1","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#0C4C88","fixed":false,"connected":false,"unit":"C"},{"number":2,"name":"Kanal 2","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#22B14C","fixed":false,"connected":false,"unit":"C"},{"number":3,"name":"Kanal 3","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#EF562D","fixed":false,"connected":false,"unit":"C"},{"number":4,"name":"Kanal 4","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#FFC100","fixed":false,"connected":false,"unit":"C"},{"number":5,"name":"Fleisch 2","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#A349A4","fixed":false,"connected":false,"unit":"C"},{"number":6,"name":"Fleisch 3","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#804000","fixed":false,"connected":false,"unit":"C"},{"number":7,"name":"Kanal 7","typ":0,"temp":null,"min":70.00,"max":250.00,"alarm":1,"color":"#5587A2","fixed":false,"connected":false,"unit":"C"},{"number":8,"name":"Kanal 8","typ":0,"temp":null,"min":70.00,"max":250.00,"alarm":1,"color":"#5C7148","fixed":false,"connected":false,"unit":"C"},{"number":9,"name":"Rost","typ":15,"temp":23.80,"min":80.00,"max":235.00,"alarm":0,"color":"#C3D69B","fixed":true,"connected":false,"unit":"C"}]}
2023-10-31 13:52:42    [ERROR]: JSON invalide
 

BBQ_Peter

New member
Status:
Habe in das Json das fehlende "Device Array" reingepatcht. Ich vermute, das sollte das Gerät mitsenden.
Dann die Tabelle devices: das create SQL stimmt mit dem Code nicht überein, es fehlen die Spalten
`item` VARCHAR(50) NULL DEFAULT ' ' ,
`cpu` VARCHAR(50) NOT NULL ,
`flash_size` DECIMAL(10,0) NOT NULL DEFAULT '0',
`active` TINYINT(3) NOT NULL DEFAULT '1',
wobei die DB-Typen nur eine Schätzung meinerseits sind.
Nach der Aktion habe ich nun einen Eintrag in der devices Tabele.
Einzelne Temperatur Werte kommen aber noch nicht rein.
Wieder vermute ich, das dazu noch vom Gerät der Key "cloud->save" benötigt wird.
Im Browser ist nach wie vor noch alles dunkel.

Kann bitte jemand das git aktualisieren ?
Offensichtlich passt da was nicht. Zu mindest den akt. Statement SQL für DBCreate.
 

Phantomias2006

Entwickler
Teammitglied
Admin
Ich hab dir die neue Struktur hochgeladen.

Hier ein Beispiel was die index.php erwarten würde:

JSON:
{
    "device": {
        "device": "mini",
        "serial": "<deineSerial>",
        "cpu": "esp32",
        "flash_size": 16777216,
        "item": "m3j09o6210B",
        "hw_version": "v3",
        "sw_version": "v1.2.2",
        "api_version": "1",
        "language": "de"
    },
    "cloud": {
        "task": "save",
        "api_token": "<deinenToken>",
        "data": [
            {
                "system": {
                    "time": "1698706220",
                    "unit": "C",
                    "soc": 100,
                    "charge": false,
                    "rssi": -75,
                    "online": 2
                },
                "channel": [
                    {
                        "number": 1,
                        "name": "Pit",
                        "typ": 3,
                        "temp": 110.80,
                        "min": 100.00,
                        "max": 120.00,
                        "alarm": 1,
                        "color": "#0C4C88",
                        "fixed": false,
                        "connected": false
                    },
                    {
                        "number": 2,
                        "name": "Kanal 2",
                        "typ": 3,
                        "temp": 50.60,
                        "min": 0.00,
                        "max": 95.00,
                        "alarm": 1,
                        "color": "#22B14C",
                        "fixed": false,
                        "connected": false
                    },
                    {
                        "number": 3,
                        "name": "Kanal 3",
                        "typ": 6,
                        "temp": 999.00,
                        "min": 90.00,
                        "max": 95.00,
                        "alarm": 1,
                        "color": "#EF562D",
                        "fixed": false,
                        "connected": false
                    },
                    {
                        "number": 4,
                        "name": "Kanal 4",
                        "typ": 0,
                        "temp": 999.00,
                        "min": 10.00,
                        "max": 35.00,
                        "alarm": 0,
                        "color": "#FFC100",
                        "fixed": false,
                        "connected": false
                    },
                    {
                        "number": 5,
                        "name": "Kanal 5",
                        "typ": 6,
                        "temp": 212.90,
                        "min": 0.00,
                        "max": 35.00,
                        "alarm": 0,
                        "color": "#A349A4",
                        "fixed": false,
                        "connected": false
                    },
                    {
                        "number": 6,
                        "name": "Kanal 6",
                        "typ": 3,
                        "temp": 999.00,
                        "min": 10.00,
                        "max": 35.00,
                        "alarm": 0,
                        "color": "#804000",
                        "fixed": false,
                        "connected": false
                    },
                    {
                        "number": 7,
                        "name": "Kanal 7",
                        "typ": 0,
                        "temp": 999.00,
                        "min": 10.00,
                        "max": 35.00,
                        "alarm": 0,
                        "color": "#5587A2",
                        "fixed": false,
                        "connected": false
                    },
                    {
                        "number": 8,
                        "name": "Kanal 8",
                        "typ": 0,
                        "temp": 999.00,
                        "min": 10.00,
                        "max": 35.00,
                        "alarm": 0,
                        "color": "#5C7148",
                        "fixed": false,
                        "connected": false
                    },
                    {
                        "number": 9,
                        "name": "Kanal 9",
                        "typ": 15,
                        "temp": 999.00,
                        "min": 10.00,
                        "max": 35.00,
                        "alarm": 0,
                        "color": "#EF562D",
                        "fixed": true,
                        "connected": false
                    }
                ],
                "pitmaster": [
                    {
                        "id": 0,
                        "channel": 1,
                        "pid": 3,
                        "value": 0,
                        "set": 110.00,
                        "typ": "auto",
                        "typ_last": "auto",
                        "set_color": "#ff0000",
                        "value_color": "#000000"
                    }
                ]
            }
        ]
    }
}
LG
 

BBQ_Peter

New member
Geschenk mit Goldschleife ! War an der Cloud.Data Struktur verzweifelt und kurz vorm aufgeben.
Merci vielmals !
 

BBQ_Peter

New member
Das was vom Gerät kommt, umformatiert Elemente zugefügt, Data richtig gestellt.
Data wird in die DB geschrieben und die Oberfläche zuckt nun auch endlich!
Bin weiter dran.
Besteht Hoffnung, das die Geräte absehbar das richtige Json an die Benutzerdefinierte-Cloud schicken ?
 

Anhänge

  • WT-Browser.png
    WT-Browser.png
    61.6 KB · Aufrufe: 3

Phantomias2006

Entwickler
Teammitglied
Admin
Besteht Hoffnung, das die Geräte absehbar das richtige Json an die Benutzerdefinierte-Cloud schicken ?
so wie du dir das vorstellst über die Oberfläche vermutlich nicht, aber die URL‘s selber müsstest du umbiegen im Thermo. Dann schickt es anstatt zum WLANThermo Server eben zu deinem und das im richtigen Format. Deshalb auch die initiale Frage an Steffen ob die Urls im Recovery Menü änderbar sind. Wir hatten mal in die Richtung etwas besprochen. Ansonsten kannst du die Software neu kompilieren des Thermos und die Urls dort direkt ändern.

Oder du machst ein eigenes kleines PHP Script welches dein Thermo aufruft und das Format ändert und weiterleitet an dir index.php. Dann bist bei Updates relativ sicher unterwegs.
LG
 

BBQ_Peter

New member
Geschafft, aber der Patch ist mega hässlich!

Wascheinlich weiss ich noch nicht, was du mit internen URLs im Thermo umbiegen meinst.
Die originale URL zum WLANThermo Server (https://cloud.wlanthermo.de/) die will ich garnicht umbiegen, die kann ich deaktivieren.

Und die Benutzerdefinierte URL , die ich eintragen kann, die ist, meiner Meinung nach OK und funktioniert.
Eingetragen in der Gerät GUI habe ich http://192.168.98.65:8080/api.wlanthermo.de/index.php?api_token=AAA und die wird auch aufgerufen.
Leider sind die eigentlichen Daten, die hier vom Gerät an die meine URL ankommen nicht kompatibel.
das Gerät sendet:
2023-10-31 13:51:41 [INFO ]: file_get_contents input:{"version":1,"interval":30,"channel":[{"number":1,"name":"Fleisch 1","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#0C4C88","fixed":false,"connected":false,"unit":"C"},{"number":2,"name":"Kanal 2","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#22B14C","fixed":false,"connected":false,"unit":"C"},{"number":3,"name":"Kanal 3","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#EF562D","fixed":false,"connected":false,"unit":"C"},{"number":4,"name":"Kanal 4","typ":0,"temp":null,"min":10.00,"max":35.00,"alarm":0,"color":"#FFC100","fixed":false,"connected":false,"unit":"C"},{"number":5,"name":"Fleisch 2","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#A349A4","fixed":false,"connected":false,"unit":"C"},{"number":6,"name":"Fleisch 3","typ":0,"temp":null,"min":1.00,"max":95.00,"alarm":1,"color":"#804000","fixed":false,"connected":false,"unit":"C"},{"number":7,"name":"Kanal 7","typ":0,"temp":null,"min":70.00,"max":250.00,"alarm":1,"color":"#5587A2","fixed":false,"connected":false,"unit":"C"},{"number":8,"name":"Kanal 8","typ":0,"temp":null,"min":70.00,"max":250.00,"alarm":1,"color":"#5C7148","fixed":false,"connected":false,"unit":"C"},{"number":9,"name":"Rost","typ":15,"temp":23.80,"min":80.00,"max":235.00,"alarm":0,"color":"#C3D69B","fixed":true,"connected":false,"unit":"C"}]}

sollte aber das senden:
https://wlanthermo.de/threads/wlanthermo_server-im-docker.4380/post-13555


Ich denke, ich lasse den Source Code sprechen. An dieser Stelle

https://github.com/WLANThermo-nano/...21c90b8d6f4d2/api.wlanthermo.de/index.php#L61

habe ich nun dieses Hässliche Entlein stehen. Gut für diesen Durchstich, aber nichts auf Dauer.

// read input data
$json = file_get_contents('php://input');
$json = rtrim($json, "}");
$json = ltrim($json, "{");
$json = str_replace("\"temp\":null","\"temp\":999.00",$json);
$jsonD = "\"device\":{\"device\":\"nano_32\",\"serial\":\"55b555\",\"hw_version\":\"v3\",\"sw_version\":\"1.2.2\",\"api_version\":\"1\"}";
$jsonS = "\"system\":{\"time\":\"" . time() . "\",\"unit\":\"C\",\"soc\":85,\"charge\":true,\"rssi\":-75,\"online\":2}";
$jsonP = "\"pitmaster\":[{\"id\":\"0\",\"channel\":\"9\",\"pid\":\"3\",\"value\":\"0\",\"set\":\"110\",\"typ\":\"auto\",\"typ_last\":\"auto\",\"set_color\":\"#ff0000\",\"value_color\":\"#000000\"}]";
$jsonC = "\"cloud\":{\"task\":\"save\",\"api_token\":\"AAA\",\"data\":[{" . $jsonS . "," . $json . "," . $jsonP . "}]}";
$json = "{" . $jsonD ."," . $jsonC . "}";


Ich würde jetzt meinen, an den https://cloud.wlanthermo.de/ wird das richtige json geschickt, an meinen irgendeine veraltete/andere Version. Würde an meinen Server die "richtige" Version geschickt werden, brächte ich kein Patch, oder ?

Was mir noch aufgefallen ist, Mein mini hat nach ca. 4h aufgehört meinen Server zu bedienen. die or. Cloud aktualisierte er weiter. Erst ein aus/an hat ihn überzeugt wieder weiter Daten auch zu mir zu senden. Ob das ein Bug ist, oder so gewolt ?

Aber trotzdem, vielen vielen Dank für den Support hier, ohne hätt ich es nicht geschafft.
Die Dockerfiles mache ich noch sauber und hänge die hier ein.

WT-Browser2.png
 

Phantomias2006

Entwickler
Teammitglied
Admin
Das Thermo sendet in die Thermo Cloud in unserem Format. Die Cloud Funktion die du nutzt ist dafür gedacht dass du dir selber was bastelst oder bei dir in die Hausautomatisierung integriert wird oder was auch immer.
Hier würde bewusst auf die Informationen bzw. den Overhead verzichtet den unser Protokoll hat, weil ja auch nicht notwendig

das ändern wollen wir nicht. Es betrifft ja dann alle die die Funktion bereits nutzen und wo integriert haben…
 
Oben Unten