debug-richard / sagemcom-dsmr

Sagemcom T210-D-r auslesen via Kundenschnittstelle
MIT License
9 stars 1 forks source link

Hilfe für encoding #1

Closed xkuyax closed 1 year ago

xkuyax commented 1 year ago

Hey,

vielen dank für deine Arbeit! Über das DSMR-Parser Projekt bin ich auf deine Repo gestoßen, da ich gerade selbst versuche von meinem T210-D-R die Daten auszulesen.

Ich habe einen Esp8266 mit folgender Schaltung am Stromzähler hängen: https://github.com/DiGierre/DSMR_reader_schematic_PCB über einen leicht abgewandelten DSMR code von esphome habe ich nun folgenden dump:

DB0853414735000538018201F2300000043726C548B8BBFA6D02B0A1A4932A705460C6B31F946220C699A09ADF5A5A79ABDBB28E9C89B0A97A44F0052D3139A9B3F0D0914B361AF20045637A6C5862FC315F9AD23AD73E4BBFCF654F77D568F01860644E5F42CC658D53F9FC7EC4036E75F94766065AE0C09A04A1B39D6055A299450FF5FB7659DD529DB9AC190BB8704582857B6938AEE52C73FA5DF1097A5E382A9342C5FEBB984EC2ED6B3F05940EA04BB4D5A1E9509E834E317CC620E66C6E06F77A6B15DF741D769C6081F916B6528C014DDF152C0DCB2D1B49CBB655AB3EACF15E5762E01A52AAA0A2716E20A56BBF3108A6D7966A0469CB6BEEE29FF2D639EC34848964EDC28F981547A1C8287CC618DE1DBBA36E52FFF9C62E325AA2CB0B1237CD968881E81EF27FC0251EF4297DE3ADF80A6659BF5FF6511768B28EA9F21A244399246D000162EB0A35BBFF7DDD5EEA6CD3A8DD61A7400175253D1E2576BB593C31E99E34776929CC97731846BE245F149FE64B4440883AD2DFEBA285B1D49CB7C22E130507746BA53F766563637A27AD503D60D2F75926270E812B0B359089D64DE2EC54533446D8BFD39C1A9759B77676A8D5BBBC672983AD00FBA14922BE78651997FBC19C9D44A56C5A542AD3C97BC8A127CDBA8D2D1093DEE879C346475163B3E504A5614E2D89970ED9510565A53252FD549FBAF608494F

auf Anfrage habe ich folgende Keys erhalten: 8B8AB6642EFD24E719DC9B2C6986FASE (als Encryption Key) (wie kann das mit dem S funktionieren?)

und 35A02911CBA199020B3899AAD8885CD5 als "Authentication key"

wenn ich nun versuche das zu encoden erhalte ich nur "ValueError: Frame length to short (encrypted)"

Könntest du mir da weiterhelfen? Mein end ziel wäre es dies in einen esphome component zu bekommen, im moment kann ich aber nicht ganz davon ausgehen das mein C++ code 100% funktioniert, wobei [18:12:01][V][dsmr:219]: Encrypted telegram length: 511 bytes sehr vielversprechend klingt

Danke vielmals!

EDIT: meine Daten wurden vom Serial Monitor von esphome abgeschnitten, jetzt wo ich alle Daten habe konnte ich den Key auf 5E "brute forcen" und erfolgreich die Daten encoden, danke!

asturma commented 1 year ago

Hallo ich habe eine ähnliche Fehlermeldung, nachdem meine Python Kenntnisse sehr rudimentär sind komme ich leider nicht weiter und bitte um Hilfe

Beim Ausführen von "python3 justdecode.py" bekomme ich folgende Fehlermeldung

Traceback (most recent call last): File "/home/pi/stromzaehler/justdecode.py", line 25, in decrypted = decrypt_frame(GLOBAL_UNICAST_ENC_KEY, GLOBAL_AUTHENTICATION_KEY, data) File "/home/pi/stromzaehler/decode.py", line 70, in decrypt_frame raise ValueError("Frame length to short") ValueError: Frame length to short

Die beiden Keys habe ich im File justdecode.py eingetragen. data_1 und data_2 sind beide leer, richtig?

Vielen Dank für Tipps und Unterstützung!

debug-richard commented 1 year ago

@asturma Nein data_1 muss die Daten des Smart Meter (DB...) enthalten. data_2 kann leer bleiben oder die Daten eines zweiten Frames enthalten.

asturma commented 1 year ago

Okay, Danke für die Info. Dran scheitert es noch :-( Muss erst herausfinden, mit welchem Befehl ich rawdata auslesen kann. Danke für den Hinweis

debug-richard commented 1 year ago

@asturma Dafür kannst du das serialtest.py Skript nutzen. Du must nur "/dev/ttyUSB0" durch den Port deines Adapters ersetzen (Unter Windows COM1/2/3...)

asturma commented 1 year ago

@debug-richard Ich bekomme nun folgenden Output wenn ich das serialtest.py ausführe Wird aktuell geliefert: {'Momentane Wirkleistung Bezug (+A)': {'value': 0, 'unit': 'W'}} Wird aktuell eingespeist: {'Momentane Wirkleistung Lieferung (-A)': {'value': 325, 'unit': 'W'}} Wurde geliefert (Zählerstand): {'Wirkenergie Lieferung (Lieferung an Kunden) (+A)': {'value': 4754257, 'unit': 'Wh'}} Wurde eingespeist (Zählerstand): {'Wirkenergie Bezug (Lieferung an EV) (-A)': {'value': 2083553, 'unit': 'Wh'}}

Zusätzlich kann ich den RAW Frame mit anzeigen. Was ich allerdings nicht ganz verstehe: der RAW Frame ändert sich ja mit jedem Durchlauf. Wie muss ich diesen nun in das justdecode.py eintragen damit auch dieses Script läuft?

debug-richard commented 1 year ago

@asturma Die Daten müssen HEX codiert sein und starten mit "DB". Das sieht dann so aus wie im ersten Post.

asturma commented 1 year ago

@debug-richard bei zwei durchläufen sieht das bei mir so aus, welchen muss ich dann eintragen?

Raw frame: db085341473500048c288201f2300000116ebc9519fde46d7093561cb93c11cead83e4a853117838bc40f6101f9448e81ddce072328b1e1eee9b1474f3c9c9bcc3dc2aeeb179af66972b1475abaf20d513b92107ddc53e07f00c3b6fa158cced8817f6419ef1f3080d827b1fdeac6088e58991fb427e54dd0ac5724237156eb0bb94d267e41896ffcfff80ca33de936f0489eec1e671126d6a5e438e5522e1e6bfeededeaacd636219d6a9c370892dcad6763f556290d7cff85ddfcfe616add4173a8f436a5655a98ae3e5c67d82e841bdfe73447890d232636e904bd42403b064d4fd957c51e0cdb25ed3f3e40c6e69cbfc231116bc960c1fe0fa47e9af0490c18f11b736de77c118ea14afce580ed8a1b8c0bdc121a33880bd19d106d5b0e5bc067b3decac9e4fb6b258f57ef856ab3e77ae7b59281f7dc9da53830baafc21c07c46fdceb5de646b80b2b48d903500b8e4135bacb61f54567564b0c5239e57f226d7419cf3f342a9640e47224ecb82a69a7488409791a932dc467ab51b71545815d695307b1ff3cc67206c12e2b921c52cea0c4efd94f6977dc8af889f748490d7b3deb045d6241b21ff8e2fb4d08fcb42bdf4cb651e87f654638ac11bae48df4507ecc0388ad2318307c0388896484b05f68ecf6146421e33b54f0109f774d366813821cf29a176bac16747e90dc729f5475008412dbf84b107e0d116ad Wird aktuell geliefert: {'Momentane Wirkleistung Bezug (+A)': {'value': 0, 'unit': 'W'}} Wird aktuell eingespeist: {'Momentane Wirkleistung Lieferung (-A)': {'value': 558, 'unit': 'W'}} Wurde geliefert (Zählerstand): {'Wirkenergie Lieferung (Lieferung an Kunden) (+A)': {'value': 4754257, 'unit': 'Wh'}} Wurde eingespeist (Zählerstand): {'Wirkenergie Bezug (Lieferung an EV) (-A)': {'value': 2083660, 'unit': 'Wh'}} Raw frame: db085341473500048c288201f2300000116f724c60bb8a6c156919ed102fb6faa22fd30b95ba2431f81d818ba119a35e47b1ffffc2d91c88100dfd45287d30640e712ae705a552aabfc0aec222945180c0bf9ee1ea88a50c5c0ff30c8e979dbe4553cbedc9b8c4a4a81d58ddcc0b17cf733eceac9f18f5c1e8ff7bb4f42483ebb323b5bc44b48825f8783c874fd2436ddde67dec66c86455bd25c6498a8b77c5f262769c392e0f72e112ae605cfbca9d3f94a8ca51eb0797525f425fbe42d88ff6e48ddcff182e2a33a15905ddac3595d8a9013159e151ed5c46bc2496553f1fbe6d9dba907a637d61afb2ab46c1ae598ce2bcda60d357b962d01272d190309a99af40650adc001e3d4c9b139b312eb988f98c8b3004303d2c1d58408eb69058bd94295bb6c91d2932b2166caf98e1f130687c4b289152dfd4c68236612f5eb2ae1f60dfa8b82dcd7e03f5213f70d29e4027e6fcb5c70be84c5641d31667fbf26234f40c78d5f8b153132c030c10e30894d3fca4891765b506bc9a31d19a2d39ed82be8dd405d545abf0cf5cba986075cdbdc3cbd0a259ebb85044d3a66b2ab2876e0a5caa93a641321f152b297bc13721951576db8c77a254bc947b5f840140c30f5e320ff9c9a46cf88693f4398ed6132ac24ba444b0eddb825ae52d6a21c320435bc18140407219eef5a913b4c34b2e46ac15e623dde2df5e2a1d4e2a9a Wird aktuell geliefert: {'Momentane Wirkleistung Bezug (+A)': {'value': 0, 'unit': 'W'}} Wird aktuell eingespeist: {'Momentane Wirkleistung Lieferung (-A)': {'value': 555, 'unit': 'W'}} Wurde geliefert (Zählerstand): {'Wirkenergie Lieferung (Lieferung an Kunden) (+A)': {'value': 4754257, 'unit': 'Wh'}} Wurde eingespeist (Zählerstand): {'Wirkenergie Bezug (Lieferung an EV) (-A)': {'value': 2083661, 'unit': 'Wh'}}

debug-richard commented 1 year ago
data_1 = "db085341473500048c288201f2300000116ebc9519fde46d7093561cb93c11cead83e4a853117838bc40f6101f9448e81ddce072328b1e1eee9b1474f3c9c9bcc3dc2aeeb179af66972b1475abaf20d513b92107ddc53e07f00c3b6fa158cced8817f6419ef1f3080d827b1fdeac6088e58991fb427e54dd0ac5724237156eb0bb94d267e41896ffcfff80ca33de936f0489eec1e671126d6a5e438e5522e1e6bfeededeaacd636219d6a9c370892dcad6763f556290d7cff85ddfcfe616add4173a8f436a5655a98ae3e5c67d82e841bdfe73447890d232636e904bd42403b064d4fd957c51e0cdb25ed3f3e40c6e69cbfc231116bc960c1fe0fa47e9af0490c18f11b736de77c118ea14afce580ed8a1b8c0bdc121a33880bd19d106d5b0e5bc067b3decac9e4fb6b258f57ef856ab3e77ae7b59281f7dc9da53830baafc21c07c46fdceb5de646b80b2b48d903500b8e4135bacb61f54567564b0c5239e57f226d7419cf3f342a9640e47224ecb82a69a7488409791a932dc467ab51b71545815d695307b1ff3cc67206c12e2b921c52cea0c4efd94f6977dc8af889f748490d7b3deb045d6241b21ff8e2fb4d08fcb42bdf4cb651e87f654638ac11bae48df4507ecc0388ad2318307c0388896484b05f68ecf6146421e33b54f0109f774d366813821cf29a176bac16747e90dc729f5475008412dbf84b107e0d116ad"
asturma commented 1 year ago

das habe ich zuvor schon versucht, bei jedem ausführen bekomme ich dann diesen Output. Die Daten aktualisieren sich dann ja nicht. Irgendwie steh ich am Schlauch :-(

(venv) pi@raspberrypi:~/stromzaehler $ python3 justdecode.py Wird aktuell geliefert: {'Momentane Wirkleistung Bezug (+A)': {'value': 0, 'unit': 'W'}} Wird aktuell eingespeist: {'Momentane Wirkleistung Lieferung (-A)': {'value': 558, 'unit': 'W'}} Wurde geliefert (Zählerstand): {'Wirkenergie Lieferung (Lieferung an Kunden) (+A)': {'value': 4754257, 'unit': 'Wh'}} Wurde eingespeist (Zählerstand): {'Wirkenergie Bezug (Lieferung an EV) (-A)': {'value': 2083660, 'unit': 'Wh'}}

Traceback (most recent call last): File "/home/pi/stromzaehler/justdecode.py", line 25, in decrypted = decrypt_frame(GLOBAL_UNICAST_ENC_KEY, GLOBAL_AUTHENTICATION_KEY, data) File "/home/pi/stromzaehler/decode.py", line 70, in decrypt_frame raise ValueError("Frame length to short") ValueError: Frame length to short

debug-richard commented 1 year ago

da data_2 leer ist bekommst du den fehler, kopiere einfach die selben daten in data_2

data_1 = "db085341473500048c288201f2300000116ebc9519fde46d7093561cb93c11cead83e4a853117838bc40f6101f9448e81ddce072328b1e1eee9b1474f3c9c9bcc3dc2aeeb179af66972b1475abaf20d513b92107ddc53e07f00c3b6fa158cced8817f6419ef1f3080d827b1fdeac6088e58991fb427e54dd0ac5724237156eb0bb94d267e41896ffcfff80ca33de936f0489eec1e671126d6a5e438e5522e1e6bfeededeaacd636219d6a9c370892dcad6763f556290d7cff85ddfcfe616add4173a8f436a5655a98ae3e5c67d82e841bdfe73447890d232636e904bd42403b064d4fd957c51e0cdb25ed3f3e40c6e69cbfc231116bc960c1fe0fa47e9af0490c18f11b736de77c118ea14afce580ed8a1b8c0bdc121a33880bd19d106d5b0e5bc067b3decac9e4fb6b258f57ef856ab3e77ae7b59281f7dc9da53830baafc21c07c46fdceb5de646b80b2b48d903500b8e4135bacb61f54567564b0c5239e57f226d7419cf3f342a9640e47224ecb82a69a7488409791a932dc467ab51b71545815d695307b1ff3cc67206c12e2b921c52cea0c4efd94f6977dc8af889f748490d7b3deb045d6241b21ff8e2fb4d08fcb42bdf4cb651e87f654638ac11bae48df4507ecc0388ad2318307c0388896484b05f68ecf6146421e33b54f0109f774d366813821cf29a176bac16747e90dc729f5475008412dbf84b107e0d116ad"
data_2 = "db085341473500048c288201f2300000116ebc9519fde46d7093561cb93c11cead83e4a853117838bc40f6101f9448e81ddce072328b1e1eee9b1474f3c9c9bcc3dc2aeeb179af66972b1475abaf20d513b92107ddc53e07f00c3b6fa158cced8817f6419ef1f3080d827b1fdeac6088e58991fb427e54dd0ac5724237156eb0bb94d267e41896ffcfff80ca33de936f0489eec1e671126d6a5e438e5522e1e6bfeededeaacd636219d6a9c370892dcad6763f556290d7cff85ddfcfe616add4173a8f436a5655a98ae3e5c67d82e841bdfe73447890d232636e904bd42403b064d4fd957c51e0cdb25ed3f3e40c6e69cbfc231116bc960c1fe0fa47e9af0490c18f11b736de77c118ea14afce580ed8a1b8c0bdc121a33880bd19d106d5b0e5bc067b3decac9e4fb6b258f57ef856ab3e77ae7b59281f7dc9da53830baafc21c07c46fdceb5de646b80b2b48d903500b8e4135bacb61f54567564b0c5239e57f226d7419cf3f342a9640e47224ecb82a69a7488409791a932dc467ab51b71545815d695307b1ff3cc67206c12e2b921c52cea0c4efd94f6977dc8af889f748490d7b3deb045d6241b21ff8e2fb4d08fcb42bdf4cb651e87f654638ac11bae48df4507ecc0388ad2318307c0388896484b05f68ecf6146421e33b54f0109f774d366813821cf29a176bac16747e90dc729f5475008412dbf84b107e0d116ad"
asturma commented 1 year ago

hab ich gemacht, jetzt zeigt es mir natürlich die gleichen daten an. soweit so gut. "Justdecode.py" ist aber ja eigentlich nur zum Testen oder? Denn mit diesem Script wird ja nur einmal ausgeführt und decodiert. Zum permanenten Check der aktuellen Daten ist dann "serialtest.py" gedacht, welches in einer Endlosschleife läuft, richtig?

debug-richard commented 1 year ago

ja, serialtest.py kann als Grundlage dienen.

derkrasseleo commented 1 year ago

@xkuyax Hast du schon erfolgreich mit esphome die Daten ausgelesen? Ich versuche auch gerade meinen Sagecom T210-D-r mit einem esp8266 über die dsmr Komponente von esphome auszulesen und komme nicht weiter. Meine Datenframes sind aus irgendeinem Grund riesig (60000 Bytes) und das Auslesen endet in einem Timeout..

xkuyax commented 1 year ago

@xkuyax Hast du schon erfolgreich mit esphome die Daten ausgelesen? Ich versuche auch gerade meinen Sagecom T210-D-r mit einem esp8266 über die dsmr Komponente von esphome auszulesen und komme nicht weiter. Meine Datenframes sind aus irgendeinem Grund riesig (60000 Bytes) und das Auslesen endet in einem Timeout..

Hi, ja ich lese seit einiger Zeit mit folgendem yaml meinen sagecom aus:

esphome:
  name: dsmr-reader

esp8266:
  board: d1_mini

# Enable logging
logger:
  baud_rate: 0
  level: VERBOSE

# Enable Home Assistant API
api:
  encryption:
    key: ""

ota:
  password: ""

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Dsmr-Reader Fallback Hotspot"
    password: ""

captive_portal:

external_components:
  - source:
      type: local
      path: my_components
  - source: github://Herbycheck/esphome@dsmr-unit-fix
    components: [ dsmr ]

substitutions:
  name: dsmr-reader
  friendly_name: DSMR Reader

uart:
  rx_pin: D7
  baud_rate: 115200
  rx_buffer_size: 1500

dsmr:
  decryption_key: !secret dsmr_encryption
  request_pin: D5
  request_interval: 10s

sensor:
  - platform: dsmr
    energy_delivered_tariff1:
      name: ${friendly_name} Energy Delivered Tariff 1
      state_class: total_increasing
    energy_delivered_tariff2:
      name: ${friendly_name} Energy Delivered Tariff 2
      state_class: total_increasing
    energy_returned_tariff1:
      name: ${friendly_name} Energy Returned Tariff 1
    energy_returned_tariff2:
      name: ${friendly_name} Energy Returned Tariff 2
    power_delivered:
      name: ${friendly_name} Power Consumed
    power_returned:
      name: ${friendly_name} Power Returned
    electricity_failures:
      name: ${friendly_name} Electricity Failures
    electricity_long_failures:
      name: ${friendly_name} Electricity Long Failures
    voltage_l1:
      name: ${friendly_name} Voltage L1
    voltage_l2:
      name: ${friendly_name} Voltage L2
    voltage_l3:
      name: ${friendly_name} Voltage L3
    current_l1:
      name: ${friendly_name} Current L1
    current_l2:
      name: ${friendly_name} Current L2
    current_l3:
      name: ${friendly_name} Current L3
    power_delivered_l1:
      name: ${friendly_name} Power Delivered L1
    power_delivered_l2:
      name: ${friendly_name} Power Delivered L2
    power_delivered_l3:
      name: ${friendly_name} Power Delivered L3
    power_returned_l1:
      name: ${friendly_name} Power Returned L1
    power_returned_l2:
      name: ${friendly_name} Power Returned L2
    power_returned_l3:
      name: ${friendly_name} Power Returned L3
    gas_delivered:
      name: ${friendly_name} Gas Delivered

text_sensor:
  - platform: dsmr
    identification:
      name: ${friendly_name} Identification
    p1_version:
      name: ${friendly_name} Version
derkrasseleo commented 1 year ago

Vielen Dank, hab eine ähnliche config momentan. Ich hab nur den request pin hardwareseitig dauerhaft auf high gelegt, ist das vielleicht ein Problem? Has du sonst irgendwas dazwischen (Optokoppler o.Ä.?) Ist in in "my_components" etwas dsmr relevantes ?

derkrasseleo commented 1 year ago

@xkuyax habe es mittlerweile geschafft, sinnvolle Daten herauszubekommen. Zu deiner Config: Bekommst du die Voltage, Current und Power L1/L2/L3 Daten aus deinem Smart Meter? Laut Doku werden die ja nicht übertragen..

xkuyax commented 1 year ago

@xkuyax habe es mittlerweile geschafft, sinnvolle Daten herauszubekommen. Zu deiner Config: Bekommst du die Voltage, Current und Power L1/L2/L3 Daten aus deinem Smart Meter? Laut Doku werden die ja nicht übertragen..

Hey, super das es bei dir auch geht 👍 Nein, bei mir sind da auch keine Daten Mehr als Power und kWh interessiert mich eig eh nicht

derkrasseleo commented 1 year ago

Aber Blindleistung und so geht auch nicht, oder? Weil die werden iwie net von der esphome dsmr Komponente unterstützt, richtig?

xkuyax commented 1 year ago

Aber Blindleistung und so geht auch nicht, oder? Weil die werden iwie net von der esphome dsmr Komponente unterstützt, richtig?

Ich hab keine Ahnung und hab mich damit auch nicht beschäftigt Schätze mal das die Daten nicht an den ESP geschickt werden 🤔

derkrasseleo commented 12 months ago

Aber Blindleistung und so geht auch nicht, oder? Weil die werden iwie net von der esphome dsmr Komponente unterstützt, richtig?

Ich hab keine Ahnung und hab mich damit auch nicht beschäftigt Schätze mal das die Daten nicht an den ESP geschickt werden 🤔

Naja laut Protokoll müssten die Daten verfügbar sein: https://www.e-netze.at/downloads-data/pdf.aspx?pdf=EN_Update%20Kundenschnittstelle%20Smart%20Meter_ID3282_WEB_RGB.pdf