Loxone / lxcommunicator

Communicate securily with the Loxone Miniserver via Websocket or HTTP requests
MIT License
63 stars 20 forks source link

Loxone Cloud Webinterface Bug - jdev/sps/getStatistic #31

Open biclighter81 opened 1 month ago

biclighter81 commented 1 month ago

Hallo zusammen,

da das Webinterface von Loxone Cloud leider keine Open Source Repository hat, eröffne ich hier eine Issue. Wir glauben einen Bug in besagtem Webinterface entdeckt zu haben. Beim Abfragen von Statistiken für controls vom Typen meter ist uns eine Differenz zwischen den angezeigten Werten im Dashboard und den vom Websocket gelieferten Daten aufgefallen. Zuerst dachten wir, dass es entweder an unserem Aufruf oder an der Methode wie wir die Binärdaten extrahieren liegt.

Websocket Aufruf

Nachdem wir den Netzwerkgraphen im Browser durchgegangen sind ist uns jedoch aufgefallen, dass wir die exakt gleiche Abfrage senden, wie das Dashboard: jdev/sps/getStatistic/1a62512a-01c9-8185-ffffc581ef707fce/diff/1230768000/1715097830/year/2 Auch die Daten, die zurück geliefert werden, sind nach einem Vergleich identisch. Also haben wir weiter geschaut, wie die Daten dargestellt werden.

Darstellung

Bildschirmfoto 2024-05-07 um 19 31 46

Beim deutschen Test Miniserver ist uns dann aufgefallen das der totale Verbrauch niedriger ist als der des Jahres 2024 (siehe Bild oben). Dies ist uns etwas komisch vorgekommen und wir haben das erste Mal dran gedacht, dass es einen Fehler im Dashboard gibt. Dann haben wir bei einem anderen Zähler das Diagramm betrachtet und optisch kam uns der Balken größer auf der Skala vor als der Wert der oben steht (siehe Bild unten).

Bildschirmfoto 2024-05-07 um 19 34 21

Ein einfacher 3 Satz bei den Pixel im Balkendiagramm SVG zeigt das der angezeigte Total Wert in textueller Form falsch ist und im Diagramm richtig:

Bildschirmfoto 2024-05-07 um 19 38 28

Pixel berechnen ist natürlich kein vertraulicher Weg :) aber auch nach weiteren Kontrollen in C# und Python sind wir immer wieder auf den gleich Wert gekommen. Wir würden uns freuen, wenn ihr die Darstellung kontrolliert und uns auf dem Laufenden haltet.

Grüße, Moritz

blxs commented 1 month ago

Hier ein Beispiel mit Python für Bild 2 die Waschmaschine:

import base64
import struct
import datetime

# Daten aus HAR Request => https://168-119-185-175.504f94a0ddaa.dyndns.loxonecloud.com:40022/jdev/sps/getStatistic/1a62512a-01c9-8185-ffffc581ef707fce/diff/1230768000/1715100265/year/2/?autht=fbd0892b8147f71f8c4ea15c7e4a99b3c8c6f02067760adc57633d59775650fe&user=web&noCacheRnd=593"

base64_string = "gACSZdUkc8kSxEFA"

bytes_data = base64.b64decode(base64_string)

uint8array = bytearray(bytes_data)

chunk_size = 12

chunks = []
for i in range(0, len(uint8array), chunk_size):
    chunks.append(uint8array[i:i + chunk_size])

for chunk in chunks:
    uint32_data = struct.unpack('<I', chunk[:4])[0]
    print("Erste 4 Bytes (Uint32):", uint32_data)
    timestamp = datetime.datetime.fromtimestamp(uint32_data)
    print("Datum aus Unix-Timestamp:", timestamp)

    float64_data = struct.unpack('<d', chunk[-8:])[0]
    print("Letzte 8 Bytes (Float64):", float64_data)