Daten dekodierung von Bresser Wetterstation mit Python3 über IRC-Protokoll - 6668

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
vasilev
User
Beiträge: 6
Registriert: Mittwoch 8. Februar 2023, 10:20
Kontaktdaten:

Guten Tag.
können wir die Daten entschlüsseln, die von der Bresser ClimateConnect-Wetterstation über IRC kommen? Soweit ich verstanden habe, wird dieses Protokoll für die Tuya-App-Automatisierung verwendet. Gestern habe ich einen Code zum Starten gefunden:

Code: Alles auswählen

import time
    import socket
    SERVER = "bresser"
    ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ircsock.connect((SERVER, 6668))
    text = ircsock.recv(240)
    print(text.strip().decode("utf-8",errors='ignore'))
aber das Ergebnis ist nicht so lesbar und ich bin mir überhaupt nicht sicher, ob die Art und Weise, wie ich es bekomme, richtig ist:

Code: Alles auswählen

b'\x00\x00U\xaa\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00K\x00\x00\x00\x003.3\x00\x00\x00\x00\x00\x00=\x9d\x00\x00\x00\x01F\x0c\x1d/Z1u\xa2\x86\x96\x17~\x17\x9a\x99S\x91\xed)r\xf8J\xac2Q\xdf#\n\x18\xe0\xff\xc4;\xefI\xa8Q\xe5\xdc\xab\t\x0c\xe1\xed\x83\t\xe1\x86\xa7\xa5n\xf8\x00\x00\xaaU'

Vielen dank
V.Vasilev
Benutzeravatar
grubenfox
User
Beiträge: 439
Registriert: Freitag 2. Dezember 2022, 15:49

möglicherweise... wenn http://weewx.com/ bei passender Konfiguration mit dem Teil kommunizieren könnte, dann ja.
Bei weewx sind die Basisstationen je nach Fall wohl entweder per USB oder irgendwie serial mit dem PC verbunden. Über Basisstationen mit WLAN sehe ich in der weewx-Doku gerade nichts.
Aber dem genutztem Protokoll sollte die Frage auf welchen physikalischen Weg die Daten von der Basisstation zum PC bzw. Programm kommen, ja egal sein.
Also möglicherweise ist da was passenden in den Sourcen von weewx versteckt.
Interessant wäre wie der wirkliche Hersteller der Wetterstation heisst. Das Bresser die Teil selbst produziert glaube ich jetzt mal nicht...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bezweifel recht stark, dass ein Chat-Protokoll fuer eine Wetterstation benutzt wird. Ausser das ist irgendwie uralter Code. Woher hast du die Information?
Benutzeravatar
grubenfox
User
Beiträge: 439
Registriert: Freitag 2. Dezember 2022, 15:49

Der Sensor bei Bresser: https://www.bresser.de/en/Weather-Time/ ... entre.html
hat für mich viel Ähnlichkeit mit den bei weewx abgebildeten Teilen der AcuRite-Geräte http://weewx.com/hardware.html. Vielleicht ist es das...
An die AcuRite-Webseiten komme ich hier nicht ran, aber laut Suchergebnissen der Suchmaschine scheint AcuRite auch irgendwelche WiFi-Teile im Angebot zu haben.
Also vielleicht sind die Bresser-Teile im weewx-Pythoncode als AcuRite bekannt.
Benutzeravatar
grubenfox
User
Beiträge: 439
Registriert: Freitag 2. Dezember 2022, 15:49

ich habe da noch was gefunden um mit dem man angeblich mit solchen Tuya-Geräten kommunizieren können soll...
https://github.com/codetheweb/tuyapi
A library for communicating with devices that use the Tuya cloud network. These devices are branded under many different names, but if your device works with the TuyaSmart app or port 6668 is open on your device chances are this library will work.
Leider ist der Code 100% Javascript. Aber was in Javascript funktioniert, sollte ja auch in Python machbar sein....
Benutzeravatar
vasilev
User
Beiträge: 6
Registriert: Mittwoch 8. Februar 2023, 10:20
Kontaktdaten:

ich habe diese: https://www.bresser.de/Wetter-Zeit/BRES ... nnect.html

gestern habe ich irgendwo hier oder in andere forum diese code gefunden :)
tuyaapi - aber du brauchst ID / key und IoT Tuya core .. und das ist nicht frei.
ich habe bisschen mit WireShark versucht :

Code: Alles auswählen

ÀÿP¦Jr·ØªªET<Uÿ"À¨²oÀ¨²kâxî]n§XPtÍUª;´	Ìý¥l²»Ô5û+ËS:´E¾Ïg<TÆi…©\{ND#
²~âÏê¶à9ÁXÖlx	ëö«¨Ù*<Ó;§nª\
Ì©µÍþ"L{%©ÒW£ ÍÊ$KͱZõC$ÁÉôPûçóü*ûÞ_+û1LÇJBi6
/PôpÑÆ+0:9gYͨÐýúg÷*½µ~©Å¼Mj¢vÙ¤õùfÒtBN`ÔûÙbS ýÞê|0.Ð@>´×ùq»gQþáÓèÄjÎÎðp±-bq¢…pâ1YK=Ú©GýÉÀãW]®
[GÖúàªU
auch mit python:

Code: Alles auswählen

print(text.strip().decode("ascii",errors='ignore'))
\\0sQ+(sS\
    28e`n;IQ
        mZ%U;3.3Q,s\)v8nkZ33pPU;3.3Q-cVAOMDt#@nkZ33pPXK
>>> print(text.strip().decode("utf-8",errors='ignore'))
\\0sQ+Ǔ(sS؎\
    28e`n;IQܫ
        mZ%U;3.3Q,s\)ɮv8nkZ33pP猰U;3.3Q-cVAOMDt#@nkZ33pPXK
wie ich gesehen habe, das ist die einzige protokol dass diese station nutzt:

nmap IP..
PORT STATE SERVICE
6668/tcp open irc
V.Vasilev
Benutzeravatar
sparrow
User
Beiträge: 4232
Registriert: Freitag 17. April 2009, 10:28

Mit der Tuyaapi bist du auf jeden Fall auf dem richtigen Weg.
Das ist irgend ein chinesisches Backend an das viele IoT-Geräte andocken.
Ich denke nicht, dass das etwas mit IRC zu tun hat. Ach wenn der Port da zufällig liegt.

Du musst also Tools und Dokumentationen finden, die erklären, wie man mit Geräten spricht, die eigentlich mit der Tuya-App/Cloud sprechen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah, das ergibt dann Sinn. Joa, Portierung von https://github.com/codetheweb/tuyapi aus grubenfox' Post ist dann das Gebot der Stunde.
Benutzeravatar
vasilev
User
Beiträge: 6
Registriert: Mittwoch 8. Februar 2023, 10:20
Kontaktdaten:

hm.
ok so jetzt habe ich verstanden. es ist aes-128-ecb verschlüsselt..
ich habe mit tuyapi probiert auch mit tuya-cli aber ich bekomme immer diese fehner:

Code: Alles auswählen

Connected to device!
DATA from device:  parse data error
[ATA from device:  3.3[��c���5��3.S�f(p���I3��h��<AtH=کG������W]�
P��sl��om device:  3.3[���s��\)ɮv8�����K34ѭ�
P��sl��56colorDATA from device:  3.3[���cVAO�MDt#@��K34ѭ�
P��sl��om device:  3.3[�q�e6��\D߫��m���K34ѭ�
DATA from device:  3.3[�ظ�'��U$A�j���@����ل2Io�����0�n�W>\�d:�^����&\�qK��(s�`�p:������Ip�w�<��<�~��8;�I�Q�ܫ
��      �
[ATA from device:  3.3[�0���~S���6 %���s��PɃ�9$��X=کG������W]�
DATA from device:  3.3[���s��\)ɮv8����?�Wv���wY�'�2F
DATA from device:  3.3[���cVAO�MDt#@�?�Wv���wY�'�2F
DATA from device:  3.3[�q�e6��\D߫��m��?�Wv���wY�'�2F
und - node index.js -> code von tuyapi..
Zuletzt geändert von vasilev am Mittwoch 8. Februar 2023, 15:36, insgesamt 1-mal geändert.
V.Vasilev
Benutzeravatar
sparrow
User
Beiträge: 4232
Registriert: Freitag 17. April 2009, 10:28

Schön dass du das bekommst. Aber das alleine hilft ja nicht, wenn du nicht sagst, _wie_ du die Daten erhälst.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was laeuft denn da fuer Code? Dieses cli aus dem Projekt? Ich vermute mal, du hast den falschen Key.
Benutzeravatar
vasilev
User
Beiträge: 6
Registriert: Mittwoch 8. Februar 2023, 10:20
Kontaktdaten:

ich habe das gleich wie hier gemacht: https://github.com/codetheweb/tuyapi/bl ... s/SETUP.md
und das gleich code .. von https://github.com/codetheweb/tuyapi

und dann:

Code: Alles auswählen

tuya-cli wizard
? Do you want to use these saved API credentials? "Access ID/Client ID" "Access Secret/Client Secret" eu Yes
? Provide a 'virtual ID' of a device currently registered in the app: DeviceID
[
  {
    name: 'Smart 7-in-1 weather station',
    id: 'deviceID',
    key: 'deviceKey'
  }
]
V.Vasilev
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und den key auch angegeben/ermittelt?
Benutzeravatar
grubenfox
User
Beiträge: 439
Registriert: Freitag 2. Dezember 2022, 15:49

__deets__ hat geschrieben: Mittwoch 8. Februar 2023, 13:59 Ah, das ergibt dann Sinn. Joa, Portierung von https://github.com/codetheweb/tuyapi aus grubenfox' Post ist dann das Gebot der Stunde.
da ist mir noch ein Gedanke gekommen.... "von Javascript nach Python, also von 'js' to 'py' oder auch 'js2py' .... Suchmaschine angeworfen und dort gelandet: :o
https://github.com/PiotrDabkowski/Js2Py
https://pypi.org/project/Js2Py/

kenne ich nicht, könnte hilfreich sein... müsste mal wer ausprobieren
Benutzeravatar
vasilev
User
Beiträge: 6
Registriert: Mittwoch 8. Februar 2023, 10:20
Kontaktdaten:

naturlich :) ich bekomme das mit tuya-cli wizard.
jetzt habe ich probiert: https://github.com/clach04/python-tuya/ ... r/tests.py

Code: Alles auswählen

import pytuya
import unittest
try:
    from unittest.mock import MagicMock 
except ImportError:
    from mock import MagicMock
from hashlib import md5
import json
import struct

LOCAL_KEY='DEVICE_KEY'
DEVICE_ID='DEVICE_ID'
IP_ADDR='DEVICE_IP..'
mock_byte_encoding = 'utf-8'

def check_data_frame(data, expected_prefix, encrypted=True):
    prefix = data[:15]
    suffix = data[-8:]
    
    if encrypted:
        payload_len = struct.unpack(">B",data[15:16])[0]  # big-endian, unsigned char
        version = data[16:19]
        checksum = data[19:35]
        encrypted_json = data[35:-8]
        
        json_data = pytuya.AESCipher(LOCAL_KEY.encode(mock_byte_encoding)).decrypt(encrypted_json)
    else:
        json_data = data[16:-8].decode(mock_byte_encoding)
    
    frame_ok = True
    if prefix != pytuya.hex2bin(expected_prefix):
        frame_ok = False
    elif suffix != pytuya.hex2bin("000000000000aa55"):
        frame_ok = False
    elif encrypted:
        if payload_len != len(version) + len(checksum) + len(encrypted_json) + len(suffix):
            frame_ok = False
        elif version != b"3.1":
            frame_ok = False
    
    return json_data, frame_ok

def mock_send_receive_status(data):
    json_data, frame_ok = check_data_frame(data, "000055aa000000000000000a000000", False)

    print(json_data)


d = pytuya.OutletDevice(DEVICE_ID, IP_ADDR, LOCAL_KEY)
d._send_receive = MagicMock(side_effect=mock_send_receive_status)
print(d.status())

fehler:

Code: Alles auswählen

python3 test.py
{"gwId":"DEVICE_ID..","devId":"DEVICE_ID.."}
Traceback (most recent call last):
  File "/var/scripts/tuyaapi/test.py", line 52, in <module>
    print(d.status())
  File "/usr/local/lib/python3.9/dist-packages/pytuya/__init__.py", line 282, in status
    result = data[20:-8]  # hard coded offsets
TypeError: 'NoneType' object is not subscriptable
V.Vasilev
Benutzeravatar
grubenfox
User
Beiträge: 439
Registriert: Freitag 2. Dezember 2022, 15:49

vasilev hat geschrieben: Mittwoch 8. Februar 2023, 15:55 jetzt habe ich probiert: https://github.com/clach04/python-tuya/ ... r/tests.py
Laut Webseite auch kaputt (und alt), aber https://github.com/jasonacox/tinytuya sieht vielversprechend aus
Benutzeravatar
vasilev
User
Beiträge: 6
Registriert: Mittwoch 8. Februar 2023, 10:20
Kontaktdaten:

Vielen dank !


mit diese module alles seht gut aus :)
Gleichzeitig habe ich die Daten von iot bekommen. und.. habe ich verstanden was ist was.

warum : "code": "temp_current", -> "value": 300 ist andere frage aber ich suche jetzt fur mehr info.

Code: Alles auswählen

import tinytuya
import json

LOCAL_KEY='...'
DEVICE_ID='...'
IP_ADDR='192....'

d = tinytuya.OutletDevice(DEVICE_ID, IP_ADDR, LOCAL_KEY)
d.set_version(3.3)
data = d.status() 
print(data)

Code: Alles auswählen

    [Smart 7-in-1 weather stat] IP    - [Off] - {'dps': {'1': 300, '2': 24, '3': 'high', '9': 'c', '10': 'm_s', '11': 'hpa', '12': 'mm', '13': 'lux', '30': 'high', '38': 201, '39': 42, '54': 10100, '55': 0, '56': 0, '57': 0, '58': 'east', '60': 800, '61': 0, '62': 0, '63': 0, '64': 67, '65': 201, '67': 201, '68': 'comfortable', '101': 90}}

Code: Alles auswählen

[
    {
      "code": "temp_current",
      "value": 300
    },
    {
      "code": "humidity_value",
      "value": 24
    },
    {
      "code": "battery_state",
      "value": "high"
    },
    {
      "code": "temp_unit_convert",
      "value": "c"
    },
    {
      "code": "windspeed_unit_convert",
      "value": "m_s"
    },
    {
      "code": "pressure_unit_convert",
      "value": "hpa"
    },
    {
      "code": "rain_unit_convert",
      "value": "mm"
    },
    {
      "code": "bright_unit_convert",
      "value": "lux"
    },
    {
      "code": "fault_type",
      "value": "normal"
    },
    {
      "code": "battery_status",
      "value": "high"
    },
    {
      "code": "battery_state_1",
      "value": "low"
    },
    {
      "code": "battery_state_2",
      "value": "high"
    },
    {
      "code": "battery_state_3",
      "value": "low"
    },
    {
      "code": "temp_current_external",
      "value": 201
    },
    {
      "code": "humidity_outdoor",
      "value": 42
    },
    {
      "code": "temp_current_external_1",
      "value": -400
    },
    {
      "code": "humidity_outdoor_1",
      "value": 0
    },
    {
      "code": "temp_current_external_2",
      "value": -400
    },
    {
      "code": "humidity_outdoor_2",
      "value": 0
    },
    {
      "code": "temp_current_external_3",
      "value": -400
    },
    {
      "code": "humidity_outdoor_3",
      "value": 0
    },
    {
      "code": "atmospheric_pressture",
      "value": 10100
    },
    {
      "code": "pressure_drop",
      "value": 0
    },
    {
      "code": "windspeed_avg",
      "value": 0
    },
    {
      "code": "windspeed_gust",
      "value": 0
    },
    {
      "code": "wind_direct",
      "value": "east"
    },
    {
      "code": "rain_24h",
      "value": 800
    },
    {
      "code": "rain_rate",
      "value": 0
    },
    {
      "code": "uv_index",
      "value": 0
    },
    {
      "code": "bright_value",
      "value": 0
    },
    {
      "code": "dew_point_temp",
      "value": 67
    },
    {
      "code": "feellike_temp",
      "value": 201
    },
    {
      "code": "heat_index",
      "value": 260
    },
    {
      "code": "windchill_index",
      "value": 201
    },
    {
      "code": "com_index",
      "value": "comfortable"
    }
  ]
  
V.Vasilev
Antworten