Hallo,
diese Wechselrichter verfügen über einen RF 2,4 GhZ Nordic.
Hat jemand eine Idee wie dieses Protokoll aufgebaut ist?
Hat jemand das schon einmal "angezapft" um ein eigenes Monitoring ohne
deren Cloudzwang zu realsieren?
Es gibt offensichtlich einen "Adapter", der das "2,4 GhZ Signal umsetzt
und dann via WLAN an deren Cloudsysteme versendet.
Google, Hersteller, etc. schweigen sich leider aus.
Danke für sachdienliche Hinweise
sorbit schrieb:> Hat jemand eine Idee wie dieses Protokoll aufgebaut ist?
Könnte auf der Basis von ShockBurst™ sein.
Eine Beschreibung findest du z.B. im NRF24L01+ Datenblatt
Martin M. schrieb:> Bekomme demnächst auch den HM-600, von daher interessiere ich mich> auch> für das Thema.> Zumal das Originalzubehör ziemlich teuer und hässlich ist...
Die schweigen sich da so ziemlich aus.
Auf jeden Fall Cloudzwang mit Kosten und dieser wohl nicht verfügbare,
teure wlan Stick
Ist da inzwischen jemand weitergekommen?
Habe mich anhand des YT Links vorgearbeitet und habe ein LC12S an einm
ESP32 (Lolin32 V1.0.0) und vesuche meinen HM-600 mittels der Polldemo
von hier https://github.com/atc1441/NETSGPClient auszulesen. InverterID
habe ich angepasst, aber ich glaube, die ersten 4 Stellen, um die meine
ID länger ist werden ignoriert.
Erstes Problem: Das LC12S lässt sich nicht konfigurieren - zumindest
spuckt dies die serielle Konsole aus.
Beschaltet ist das LC12S so:
VCC - 3V3
GND - GND
CS - GND
SET - IO4
Rx - IO16
Tx - IO 17
--> D.h. wenn, dann läuft es mit irgendwelchen Defaultwerten
In der Konsole bekomme ich folgenden Nonsense bei aktuell schwankend
20-40W AC über Steckdose gemessen (klar, der WR ist ein anderer und hat
ja bspw. 2 Strings usw...)
1
14:19:13.023 -> Received Inverter Status
2
14:19:13.023 -> Device: 7201xxxx
3
14:19:13.023 -> Status: 0
4
14:19:13.023 -> DC_Voltage: 46.00V
5
14:19:13.023 -> DC_Current: 629.00A
6
14:19:13.023 -> DC_Power: 28934.00W
7
14:19:13.023 -> AC_Voltage: 0.00V
8
14:19:13.023 -> AC_Current: 0.00A
9
14:19:13.023 -> AC_Power: 0.00W
10
14:19:13.023 -> Power gen total: 0.00
11
14:19:13.023 -> Temperature: 0
Sieht sich jemand in der Lage das Programm anzupassen?
Hier ein Ausschnitt, welche Bytes überhaupt ausgewertet und wie sie
verrechnet werden. Ich wüsste jtzt nicht welche Bytes wie rum zu shiften
und verrechnen sind...
Eule schrieb:> Habe mich anhand des YT Links vorgearbeitet und habe ein LC12S an einm> ESP32 (Lolin32 V1.0.0) und vesuche meinen HM-600 mittels der Polldemo> von hier https://github.com/atc1441/NETSGPClient auszulesen. InverterID> habe ich angepasst, aber ich glaube, die ersten 4 Stellen, um die meine> ID länger ist werden ignoriert.
Hi Eule,
ich habe das gleiche bei meinem HM-1200 versucht.
Allerdings bekomme ich einfach keine Antwort nach: "Sending request now"
wie hast du denn die InverterID im code eingegeben ?
einfach die komplette Seriennummer vom WR (12 stellen) wie hier ?
constexpr const uint64_t inverterID = 0x11617052xxxx ;
Hallo Eule
habe auch seit ein paar Tagen eine kleine Solaranlage mit dem Hoymiles
HM-600, dein Projekt würde mich interessieren. Habe zwar kein Zigbee,
aber bei Software kenne ich mich ein bisschen aus. Den SGP-Client habe
ich auch schon ins Auge gefasst, aber bei fehlendem Zigbee dann
verworfen.
Also, ich schau's mir mal an.
Wäre gut wenn du irgendwie die Kommunikation mitschneiden könntest, und
im Klartext als auch als Hex-Dump hättest.
Hast du am Original-Code was geändert, oder so wie in Github zu finden?
>> Hi Eule,>> ich habe das gleiche bei meinem HM-1200 versucht.> Allerdings bekomme ich einfach keine Antwort nach: "Sending request now">> wie hast du denn die InverterID im code eingegeben ?> einfach die komplette Seriennummer vom WR (12 stellen) wie hier ?>> constexpr const uint64_t inverterID = 0x11617052xxxx ;
Hallo Chris,
ja genau. Geht aber genauso gut oder schlecht, wie wenn ich die ersten 4
Stellen einfach weglasse und nur die letzten 8 verwende.
Es scheint, dass sich irgendwas verändert, wenn ich das Modul in der
Hand habe. Auf dem Tisch liegtnd bekomme ich meist auch keine Antwort,
halte ich es in der Hand oder an den Kabeln tut sich meist etwas.
Entweder diene ich als Antenne oder ich habe einen Wackler, den ich
trotz mehrmaligem Auftrennen und Neuverbinden nicht wegbekomme.
Bin einfach zu lange raus aus dem C++, mich verwirrt die Polldemo. :(
Gruß Eule
Hubi schrieb:> Hallo Eule> habe auch seit ein paar Tagen eine kleine Solaranlage mit dem Hoymiles> HM-600, dein Projekt würde mich interessieren. Habe zwar kein Zigbee,> aber bei Software kenne ich mich ein bisschen aus. Den SGP-Client habe> ich auch schon ins Auge gefasst, aber bei fehlendem Zigbee dann> verworfen.> Also, ich schau's mir mal an.> Wäre gut wenn du irgendwie die Kommunikation mitschneiden könntest, und> im Klartext als auch als Hex-Dump hättest.> Hast du am Original-Code was geändert, oder so wie in Github zu finden?
Hallo Hubi,
ich habe mir so ein LC12S Modul besorgt und an die 2. UART eines Lolin
Boards gehängt. Die Polldemo habe ich lediglich um meine Inverter ID
angepasst.
Ansonsten habe ich inzwischen auch an zig Stellen im Code rumgedoktert -
aber ich bin was das angeht mittlerweile einfach ein richtiger Anfänger.
Mal alles was der WR ausgibt mitschneiden war auch meine Idee, bekomme
ich aber auf die Schnelle nicht hin. Ich frage mich eh, wie der Aaron
das "entschlüsselt" hat. Wenn die Werte halbwegs mit irgendwas
zusammenpassen, kann man es sich ja noch zusammenreimen. Aber das passt
bei mi gar nicht. Auch frage ich mich, woher kennt er den "command" mit
0xc0, 0xc1 usw.? Woher kennt er das Magic Byte? Ist das alles beim HM
gleich oder anders?
Gruß Eule
Hi Eule
hier auf die Schnelle der Code zur Ausgabe des Dumps:
void printBuffer (char * richtung) { // rein oder raus, send oder rcv
int i;
uint8_t ch;
Serial.println(richtung);
// drucke zuerst als Zeichen
for (int i = 0; i < sizeof(mBuffer); i++) {
ch = mBuffer[i];
if (ch >= 32 && ch < 127) Serial.print(ch); else Serial.print ('.');
}
Serial.println();
// jetzt das ganze in Hex
for (i = 0; i < sizeof(mBuffer); i++) {
ch = mBuffer[i];
if (ch < 10) Serial.print('0');
Serial.print (ch, HEX);
}
Serial.println();
}
Moin
es wäre auch von Vorteil, wenn man nach dem sendCommand in der Methode
getStatus den Buffer mBuffer wieder komplett löschen würde, etwa durch
memset (mBuffer, 0, sizeof(mBuffer))
Da ab der Stelle 6 im mBuffer die DeviceId gefüllt wird (beim Senden)
und dort nach Empfang des Status auch wieder steht, könnte man durch das
vorherige Löschen ersehen, ob der Sender, also der WR, die DeviceId
eingetragen hat.
Dann wüßte man wenigstens, dass der WR richtig antwortet.
Kleines Update:
Rx und Tx gehören anders herum, als im Code-Kommentar.
D.h. alles was ich ab und zu "gelesen" habe, waren Geister.
Nach dem Drehen von Rx/Tx erste Erkenntnis: die beiden Tx haben sich
nicht weh getan, denn nun wird zumindest mal die Konfiguration des LC12S
geschluckt! :)
Aber vom Wechselrichter höre ich mit den gegeben Einstellungen für
Channel und Network ID nichts.
Ich bin dann auf dieses tolle Repository gestoßen:
https://github.com/Yogui79/IntexPureSpa
Da gibt's unter Tools was zum Suchen des Channels und der Network ID.
Der klappert einfach einen nach dem anderen durch. Dauert halt... bisher
noch kein Treffer beim Channel.
Naja vielleicht hat der Hoymiles ja doch garkein LC12S verbaut...? Mal
abwarten.
Gruß Eule
OK, mal wieder was gelernt... Aber ans Ziel kam ich damit nicht.
Die Kanalsuche schlägt nicht an.
Also nochmal nach dem DTU gesucht und siehe da, ein Bild mit der
aufgedruckten FCC ID gefunden. Die dokumentieren ja üblicherweise ihre
Tests.
Aha! https://fcc.report/FCC-ID/2ARNB-DTUW100
Wie man bei den internal photos sieht - kein LC12S verbaut. Sieht nach
Eigenentwicklung - oder zumindest -layout aus.
Wieso nicht noch weiter bei der FCC nach Hoymiles suchen? Achja, da
gibt's ja auch ein RF Modul namens HM2401 einzeln - zum Verbau im WR
vermutlich: https://fccid.io/2ARNB-HM2401
Auch hier gibt's nette Bilder. Das schaut tatsächlich nach was anderem
aus, als das LC12S
(https://fccid.io/2ARNB-HM2401/Internal-Photos/Internal-Photos-4572280)
Aha! Ein NRF 24LE1E!
Ich muss mal in den Keller, glaube sowas habe ich auch noch wo
rumfliegen.
Gruß Eule
Tach
in der Zwischenzeit habe ich einen RF24-Scanner in meinem Gartenhaus
laufen lassen. Scanner sind bei diversen RF24 Libs als Beispiel dabei.
Es wird nach Carriern auf den Kanälen gesucht. Mein bisheriges Resultat:
- auf den Kanälen 1-14 ist recht viel los, sind ja auch die vom WLan
- auf Kanal 64, der bei dem Polldemo benutzt wird, war rein garnichts
los
- meiste Aktivität war auf Kanal 16 bei 2 Mbps
Mein nächster Ansatz, falls sonst keine neueren Erkenntnisse, wird sein,
auf dem Kanal mal etwas zu senden, evtl sowas wie die Statusabfrage, und
die Antwort abzuwarten.
Übrigens: im Arduino-Repository gibt es die Lib nrf-hal, die stammt aus
dem Hause Nordic und könnte die schon erwähnte proprietäre Lib für die
Hoymiles sein.
Moin zusammen,
kann ich hier mitmischen? Ich habe grade meine "Versuchsanlage" mit
einem HM-600 in Betrieb genommen. Auf Grund dieses Beitrags habe ich
jetzt ein NRF24-Mudul und einen Arduino zusammengesteckt und einen
Scanner am laufen. Leider noch ohne Erfolg.
Welche Scansoftware habt ihr eingesetzt und wie groß ist der Abstand HM
und NRF-Modul (bei mir etwa 10m)? Wahrscheinlich ist es sinnvoll, den
Empfänger mal direkt neben den HM zu setzen, oder? Kann ich erst machen,
wenn es wieder hell ist. Finkt der HM überhaupt, wenn die Panels keine
Spannung liefern?
Viele Grüße
Carsten
Hallo,
ich hatte gesehen, dass in den FCC-Dokumenten, die weiter oben verlinkt
sind, ein user manual enthalten ist. Dort ist angegeben:
Channel List
2403, 2423, 2440, 2461, 2475MHz
Vielleicht hilf das, die Suche einzugrenzen?
Carsten B. schrieb:> einen> Scanner am laufen. Leider noch ohne Erfolg.
Hast du denn das Hoymiles Kommunikationsmodul (DTU-W100 ) laufen?
Vielleicht antwortet der Wechselrichter nur auf Anfragen von diesem
Gerät.
Hallo,
DTU habe ich keine, war mir zu teuer und ich hätte es gern "cloudfree".
Den Fehler beim Scanner habe ich gefunden, ich hatte noch zwei Pins
vertauscht läuft jetzt.
Noch kann ich aber keinen Kanal dem HM zuordnen.
Hallo
meine Versuche mit dem Scanner hatte bisher keinen Erfolg. Oben gab es
die Nachfrage welche Scanner eingesetzt wurden, ich nutzte die von den
Libs rf24 und nrf_hal. Soviel ich weiß haben die nrf24l01 nur bis zu 126
Kanäle.
Der Abstand zum HM-600 war nur knapp 2 m, und durch die Holzdecke +
Schindeln.
Bin jetzt leider am Ende meines Lateins, wenn noch jmd eine Idee hat
mache ich gerne weiter.
ich bin auch interessiert - aber leider momentan viel zu wenig Zeit
Aber schaut Euch doch das mal an:
https://github.com/Koenkk/zigbee2mqtt/issues/4221
Hoymiles kommt aus dem gleichen Haus wie APSystems - denke das Protokoll
ist sehr ähnlich
Dort sind ein paar sehr fixe Jungs unterwegs die gerne behilflich sind
Hallo zusammen, ich hänge mich hier mal rein, weil ich auch Cloud-Free
den "MI" auslesen will. In meinem Fall 2 HM-600.
Hoymiles kommuniziert über "Nordic proprietary"... siehe Anhang
Nordic proprietary != Zigbee
anderes Adress-/CRC-Protokol... mehr hab ich leider noch nicht erfahren
können... versuche auch schon mit 'nem NRF24l01 irgendwas zu
empfangen... fürchte aber, dass der Inverter wie beim NETSGPClient
getriggert werden muss... also aktiv Daten geholt werden.
Ansonten werden laut FCC-Test nur Kanal 13, 40 und 76 getestet
("Fundamental frequency")
Grüße^^
Das Gerät wird nicht ständig Senden. Wenn dann nur Keep Alive Packets
mit größeren Abständen. Es könnte sogar sein, dass der Empfänger auch
nicht ununterbrochen aktiv ist und zum Einschalten der Träger erst ein
paar Sekunden anstehen muss. Die Hoymiles sind mit < 50mW Verbrauch bei
Dunkelheit angegeben. Für permanentes Wlan reicht das nicht.
Eigenlich müsste jemand mit einem Hoymiles Kommunikationsmodul die
Kommunikation mitschneiden.
Einhart P. schrieb:> Eigenlich müsste jemand mit einem Hoymiles Kommunikationsmodul die> Kommunikation mitschneiden.
Ich bin am überlegen, ob ich mir DTU-Wlite bestelle, gibt es momentan
für 79€. Ist immer noch viel Geld...und beschränkt auf 4 Module...
Bisher hat keiner der Beteiligten hier eine DTU?
Mein Testaufbau mit den NRF24 und dem Arduino funktioniert, zwischen
meinen beiden NRF-Modulen kann ich erfolgreich Daten austauschen. So
bald das Wetter es zulässt, packe ich einen Empfänger neben den
Hoymiles.
Tja, vllt findet sich ja einer mit DTU, der hier mitmachen will, wäre
super.
Meine Tests von heute morgen brachten folgende Resultate:
- es scheint kein alive-Paket zu geben, das von den Hoymiles verschickt
wird
- Test auf Carrier-Signal auf den Kanälen, 13, 40 und 75 , dass nur auf
Kanal 40 ein Carrier-Signal gefunden wurde, innerhalb einer Minute
mehrere hundert.Auf den beiden anderen Kanälen war ab und zu ein
Carrier, kann auch Rauschen sein.
Ich denke, ohne dass man da die Kommunikation mitschneidet wird es sehr
aufwendig. Ich versuch mal, ähnlich wie bei dem o.g. Projekt mit
APsystems zu pollen.
Hallo zusammen,
mich interessiert das Ding auch, daher habe ich mir jetzt den DTU Lite
bestellt, sowie einen HackRF SDR zur Protokoll-Analyse.
Mein Ziel ist, die Kommunikation mitzuschneiden und die Daten mit einem
nRF24 und ESP ins Heimnetz zu bringen. Die Info über die verwendeten
Kanäle ist schon mal nützlich zur Eingrenzung der Suche.
Ich melde mich, wenn dann mal alles da ist und ich Messungen machen
konnte.
Toll dass es hier weitergeht.
Meine Tests haben zu keinem Ergebnis geführt. Das große Problem dabei
ist, dass zuviele Parameter zueinander passen müssen, nämlich Kanal,
(5-byte) Adressen der NRFs, Protokoll (Shockburst oder enhanced SB),
Aufbau Datenpaket, "Magic" Byte, Füllbytes, CRC etc.
Wenn meine Programmierkenntnisse gebraucht werden, gerne.
martin schrieb:> Hallo zusammen,> mich interessiert das Ding auch, daher habe ich mir jetzt den DTU Lite> bestellt, sowie einen HackRF SDR zur Protokoll-Analyse.
Hallo zusammen.
Die Teile sind da und ich habe bereits erste Versuche durchgeführt,
wovon ich euch einen Zwischenstand mitteilen möchte.
Zum Funkprotokoll:
Die Kanäle 3,23,40,75 scheinen zu passen, hier sieht man im Spektrum die
Datenpakete, die per NRF gesendet werden. Die DTU scheint auch
regelmäßig alle Kanäle zu bedienen - ob der Inverter immer auf dem
selben Antwortet oder ob die Pakete redundant sind kann ich noch nicht
sagen.
Im Zeitverlauf kann man die Datenpakete auch schön sehen, allerdings bin
ich mir nicht sicher ob der Universal Radio Hacker sie richtig
dekodieren kann - mir fehlt der Vergleich, welche Daten es denn sein
sollen.
Dann hab ich mir die DTU mal genauer angeschaut. Alles in allem keine
Raketentechnik.
-Ein GD32F303 (Gigadevice, ein STM-Klon) mit SPI Flash 25Q128 .
-Ein ESP8266 für die WLAN Kommunikation
-Ein NRF24LE1E mit 2401C (RF Front End)
Nachdem ich die beschriftete SPI-Schnittstelle gesehen habe, dachte ich
"Da kann ich ja direkt die NRF-Kommunikation abfangen und mit den
Funkpaketen vergleichen" - war aber leider nix, die Schnittstelle wird
nicht benutzt. Ich muss jetzt also herausfinden, wo der NRF mit dem
anderen uC kommuniziert. Ich vermute mal, dass irgendwo noch eine UART
lauert.
Den "USB"-Anschluss werde ich mir auch noch genauer ansehen, der scheint
nämlich der Beschriftung nach ebenfalls eine UART zu sein. Mal schauen,
was die ausgibt. Gibt also noch bisschen was zu tun...
Soweit für heute, ich melde mich, wenn ich mehr herausgefunden habe.
Schönen Sonntag euch allen.
Hallo Martin,
sehr cool. Ich bin leider wehen ständigem Streß auf der Arbeit und
Mistwetter nicht weiter gekommen. Ich wollte eines meiner NRF24-Module
dicht an den Hoymiles auf dem Dach positionieren.
Mal sehen, grad kommt die Sonne raus ...
Carsten
Ich steige mal wieder mit ein.
Folgende Überlegung: wenn dieses Teil über USB eine
Programmierschnittstelle hat, könnte man doch die Firmware mittels
esptool auslesen. Und es gibt einige Reverse engeneering tools (wie zB
Ghidra) , mit denen man wieder C-code generieren kann. Vllt lässt sich
darüber etwas über die benötigten Infos wie Kanal, Adressen etc
rausfinden.
Hallo zusammen,
ein kleines bisschen bin ich auch weiter gekommen mit meinem Reverse
Engineering der DTU.
Zuerst musste ich aber lernen, dass das erste Funksignal im meinem
oberen Beitrag k*cke aussieht. War nicht richtig abgetastet. Hier ein
Bild wie es aussehen muss. Das kann man dann auch schön demodulieren, um
daraus die Bitfolge auslesen zu können. Damit muss ich allerdings noch
ein bisschen hin und her experimentieren, weil ich nicht genau weiß wie
viele Bits der NRF tatsächlich sendet.
Deshalb habe ich mir gleichzeitig die Platine noch ein bisschen näher
angeschaut. Die im Bild markierten Testpunkte sind Rx/Tx einer seriellen
Schnittstelle zwischen dem NRF und dem GigaDevice, welche ich mir dann
mit dem Logic angeschaut habe - die Baudrate ist übrigens 125.000
Baud/sec.
Dadurch erhoffe ich mir Rückschlüsse, ob das Funksignal auch richtig
demoduliert wurde - ich habe jedenfalls schon übereinstimmende Sequenzen
gefunden. Aber für belastbare Daten und eine saubere Analyse brauche ich
mehr Zeit...
Wenn ich dann mal weiß, wie viele Byte der NRF sendet werden und was die
Adressen sind, versuche ich einen eigenen NRF mithorchen zu lassen.
Schönen Rest-Sonntag noch.
Gruß, Martin
Hallo Martin
hast du dir schon das Shockburst bzw enhanced Shockburst Protokoll von
Nordic angeschaut? Dein Abtast sieht danach aus, denn da findet man die
Startsequenz 0x55. Danach sollte eine 3 bzw 5 byte lange Adresse folgen,
und im Fall von enhanced SB ein 9-bittiges (richtig neun!) Kontrollbyte.
Hubi schrieb:> Hallo Martin> hast du dir schon das Shockburst bzw enhanced Shockburst Protokoll von> Nordic angeschaut? Dein Abtast sieht danach aus, denn da findet man die> Startsequenz 0x55. Danach sollte eine 3 bzw 5 byte lange Adresse folgen,> und im Fall von enhanced SB ein 9-bittiges (richtig neun!) Kontrollbyte.
Hallo Hubi,
ja, das Enhanced Shockburst hab ich mir angeschaut - dürfte passen.
Ich habe hier mehrere Re-Transmits eines Pakets untereinandergelegt, die
sich (halbwegs) sauber demodulieren ließen (bisschen Jitter ist in den
einzelnen Bitfolgen).
Es tauchen vertraute Zahlenfolgen darin auf, nämlich jeweils die letzten
8 Ziffern (=Hex) der Seriennummern von Inverter und DTU. Siehe Beispiel
- möchte meine Seriennummern nicht preisgeben ;-)
Die eigentliche RF-Payload ist 27 Byte. Das passt auch zu dem, was der
NRF seriell an den Controller schickt - das sind 29 Byte, wobei das
erste und letzte Byte immer gleich sind (0x7E..0x7F). Ich vermute mal,
die werden als Start- und Endmarker benutzt oder als Commands für den
uC.
Die Datenrate müsste 250 kbps sein, das habe ich mal mit einem eigenen
NRF und einem Sendetest quergeprüft.
Ich konnte bisher noch nicht herausfinden, welche CRC verwendet wird und
ob die Payload selbst auch nochmal mit einer CRC versehen ist.
Als nächstes will ich deshalb untersuchen, welche Daten in der Payload
versteckt sind. Da müssten sich ja theoretisch die Leistungs- und
Stromwerte finden lassen, die die App anzeigt. Das wird aber nochmal ein
größerer Brocken Arbeit...
Vielleicht gelingt mit diesen Informationen ja dem ein oder anderen auch
schon eine Kommunikation?
Hubi schrieb:> Dein Abtast sieht danach aus, denn da findet man die> Startsequenz 0x55.
Ein 0x55 sagt über das Protokoll eher wenig aus. Das ist eine
Standardsequenz, die eigentliche jede Funkübertragung benötigt, damit
sich der Empfänger einpegeln kann.
Hallo Martin,
hast du in der Spec vom Nordic den Abschnitt von der CRC gesehen:
CRC (Cyclic Redundancy Check)
The CRC is the error detection mechanism in the packet. It may either be
1 or 2 bytes and is calculated over the address, Packet Control Field
and Payload.
The polynomial for 1 byte CRC is X8 + X2 + X + 1. Initial value 0xFF.
The polynomial for 2 byte CRC is X16+ X12 + X5 + 1. Initial value
0xFFFF. No packet is accepted by Enhanced ShockBurstTM if the CRC fails.
Das könnte helfen, die verwendete crc herauszufinden
https://infocenter.nordicsemi.com/pdf/nRF24LE1_PS_v1.6.pdf
Hallo zusammen,
hier mal wieder ein Update zur Protokoll-Analyse.
Ich habe nun etwas mehr Durchblick bei der Kommunikation erreicht. Also
es ist definitiv das Enhanced Shockburst Protokoll. Das direkt per
RadioHacker zu analysieren ist schwierig, da es nicht immer exakt
demoduliert wird - hinzu kommen die 9 Bit Status-"Byte", die die
erkannte Bitfolge um 1 verschieben ggü. der eigentlichen Payload.
Ziemlich unschön. Aber wenn man damit die Randbedingungen geklärt hat,
gibt es eine bessere Methode: Sniffen mit dem nrf24sniffer von yveaux.
Er hat ein kleines Arduino-Programm für einen Nano mit nrf24, sowie ein
Windows-Tool, das mit Wireshark gekoppelt wird - Anleitung auf seiner
Homepage, siehe GitHub-Link.
https://github.com/Yveaux/NRF24_Sniffer
Dazu muss man noch folgende Startparameter wissen:
-Die Empfängeradresse des Inverters entspricht den letzten 8 Stellen der
Seriennummer, aber umgedreht (Little Endian) - 00 anhängen nicht
vergessen, da die gesamte Adresse des NRF 5 Byte lang ist.
-Die Datenrate ist 250 kbps, max. Payload 32.
Man kann das Tool dann hiermit starten (siehe Screenshot) und bekommt
die Datenpakete in Wireshark serviert. Der oben bereits beschriebene
Protokoll-Aufbau (innerhalb der Payload) scheint zu passen, eine CRC
konnte ich darin nicht ausfindig machen - die des NRF wird mit diesem
Tool automatisch geprüft.
So konnte ich das was die DTU sendet direkt auf dem Rechner empfangen.
Im nächsten Schritt hänge ich einen 2. NRF mit der Adresse der DTU dran,
um das was der Inverter zurück schickt abzufangen. Und dann geht es
darum, den Inhalt zu identifizieren - einen offensichtlichen
Zusammenhang zu den physikalischen Größen habe ich leider noch nicht
entdeckt. Scheint aber eine Menge Overhead drin zu sein...
Hallo Martin
ich verfolge sehr intensiv deine "Forschung". Bin gerade dabei, das
ganze mit einem Aruino pro mini und eine nrf24 nachzubauen, aber es
kommt keine Kommunikation zustande, WR antwortet nicht.
Vllt könntest du mir folgendes kommentieren:
(nur zur Info: ich benutze Lib RadioHead, die macht von Hause aus schon
das enhanced SB)
1) wenn mein WR die Ser.Nr. 112233445566 (dezimal), so nehme ich letzte
8 Stellen, also 33445566, daraus in Hex 0x01FE56BE und setzte damit im
nRF die Adresse mit dem byte-Array {BE,56,FE,01,00}, oder muss das 0x00
vorne hin?
2) in der payload setzte ich nach der 0x15 wiederum die Adresse des WR
(BE,56,FE,01) und danach den Rest wie in deinem Bild vom WireShark (72
81 88 ...).
Aber es passiert nichts, keine Antwort vom WR.
Eine Idee? Wenn nicht wartete ich weitere Ergebnisse ab.
Hallo Hubi,
nein, die Adresse des WR nicht in Hex umwandeln sondern direkt (die ist
quasi schon Hex). Also aus deiner SN wird Ox66554433 als erste 4 Byte
der Adresse für den NRF im Inverter. Plus vermutlich 01 als 5. Byte.
Dann die Ox15 als (irgendein) Kommando. Der WR antwortet an dieser
Stelle mit 0x95.
Danach die Empfangsadresse nochmal richtig rum innerhalb der Payload,
sowie die Sendeadresse. Die 72818832 ist die Seriennr. meiner DTU, da
kannst du also theoretisch irgendwas nehmen, was du deinem NRF als
"DTU"-Adresse gibst.
Die 0x80 OB nach den Adressen scheint auch immer da zu sein. Ich weiß
noch nicht, wofür das steht. Genauso wenig wie ich bisher über die
restlichen 16 Byte weiß...
Martin, Danke für die ausführliche Erklärung.
Aber auch damit habe ich bisher keinen Erfolg, leider. Da muss noch
irgendwas anderes nicht stimmen, payload dynamisch oder fix, auto ack,
???
Hallo Hubi,
ich vermute Mal, dass die "DTU" zuerst eine Initialisierung schicken
muss. Habe aber keine Ahnung wie die aussehen muss.
Dieses Wochenende komme ich auch nicht mehr dazu weiterzumachen, bin
unterwegs...
Melde mich, wenn ich mehr weiß.
Hallo zusammen,
ich stelle mir gerade die Frage, welche Wechselrichter ich mir für mein
geplantes "Balkonkraftwerk" zulegen soll. Auch für mich wäre eine
direkte Kommunikation zum Wechselrichter (ohne Hersteller-"Cloud"-Zwang)
sehr attraktiv.
Die Ermittlungen von @martin sind sehr interessant.
Da ich auch beruflich mit ähnlich aufgebauten Systemen zu tun habe,
wollte ich mal darstellen, welche Möglichkeiten ich kenne, solch ein
System aufzubauen.
Vielleicht hilft das ja, mit der Analyse weiterzukommen.
Also: Das "DTU" scheint nach @martins Analyse aus folgenden drei
Hauptkomponenten zu bestehen (siehe Abbildung 1):
- ESP-12F: Das ist ein komplettes "System on Module" mit ESP8266
Mikrocontroller und integriertem WLAN. Theoretisch könnte die
gesammte "Intelligenz" darauf programmiert sein.
- NRF24LE1E: Das ist auch ein komplettes "System on Chip":
(https://infocenter.nordicsemi.com/pdf/nRF24LE1_PS_v1.6.pdf [1]).
Es besteht aus einem direkt an einen allgemeinen Mikrocontroller
gekoppelten RF-Frontend.
Wenn wir auf der Schnittstelle zwischen Controller und RF-Frontend
lauschen könnten, hätten wir gewonnen. Aber das wird nix, denn die
ist "im Chip".
- GD32F303: Der dritte Controller im System. Allein die Tatsache, dass
dieser überhaupt vorhanden ist, deutet IMHO darauf hin, dass die
"Hauptintelligenz" des "DTU" hierauf implementiert ist. Denn
technisch hätten die anderen beiden Subsysteme beide genug
Rechenpower/Speicher/etc, um ohne weitere Hilfe die Aufgabe des
"DTU" zu erledigen.
Belauschen können wir die Kommunikation zwischen den Chips, also die
Wege (A), (B) und (C). (A) gibt es vermutlich nicht, wenn der GD32F303
die zentrale Steuerung macht - dann muss WLAN und Nordic nie miteinander
reden.
Die Kommunikation (B) zum WLAN ist im ersten Schritt vermutlich eher
uninteressant.
Bleibt also die Verbindung (C) zwischen GD32F303 und NRF24LE1E.
Hier können wir nun "Glück" oder "Pech" haben, oder irgendetwas
dazwischen:
"Glück"-Szenario: Auf dem Mikrocontroller des NRF24LE1E läuft nur eine
ganz einfache Software, die eingehende Bytes/Pakete 1:1 an das
eingebaute RF-Frontend durchreicht.
"Pech"-Szenario: Auf dem Mikrocontroller des NRF24LE1E ist eine Software
implementiert, die "Kommandos" vom GD32F303 empfängt, und diese dann
selbst in passende RF-Pakete übersetzt. Und eventuell auch mit einem
fest im Controller hinterlegten Schlüssel verschlüsselt (die eingebaute
Verschlüsselungs-Hardware ist ein Grund, warum man solch ein System so
entwerfen würde).
Im "Glück"-Szenario hätten wir so gut wie gewonnen. Wir könnten quasi
die RF-Kommunkation mitlesen, und sie somit auch mit einem eigenen
NRF24LE1E nachbauen. Ganz unwahrscheinlich ist das nicht, denn dieses
Szenario ist natürlich (von Herstellerseite) einfacher zu
implementieren, als auch noch für den NRF24LE1 "kompliziertere" Software
zu schreiben. Und mir scheint, es steht zumindest nirgendwo in der
Werbung, dass die Wechselrichter "verschlüsselt" kommunizieren.
Meine Frage an @martin wäre also: Kannst Du die Verbindung (C) irgendwo
entdecken und darauf mithören? Am wahrscheinlichsten sind das einfach
eine RX und eine TX Leitung zwischen den beiden Chips (UART). Der
Mikrocontroller hat laut Datenblatt ([1], s.o.) genau eine serielle
Schnittstelle, bei dem verbauten 32-pin-Gehäuse sollten die hier sein:
- P0.4 (Pin 7): RXD
- P0.3 (Pin 10): TXD
Auf Deinen Fotos passt das auch insofern, als diese Pins jeweils in ein
Via gehen. Da könntest Du mal versuchen, die Leiterbahnen zu verfolgen.
Oder direkt da mit einem Tastkopf abgreifen. An einem Oszi sollte sich
da schnell ein Signal zeigen und die Datenrate lässt sich dann
rausmessen.
(Die GND, CVV, ROG, SCK, SI, SO, SCN, RST Kontakte sind vermutlich "nur"
die Programmierschnittstelle für den NRF24LE1 und werden im Betrieb
keine Daten übertragen.)
Jetzt bin ich mal gespannt, ob Ihr mit meiner Analyse übereinstimmt, und
natürlich, ob @martin auf den Pins sinnvolle Signale mitlesen kann!
Viele Grüße
-- Petersilie
(sorry, Vorname ist auch "Martin" - davon haben wir schon mehrere in
diesem Thread...)
Hallo Martin/Petersilie ;-)
ja, die beiden Testpunkte gehen an die Rx/Tx Pins des NRF24LE1E.
Ich habe auch schon die Kommunikation zwischen NRF24LE1E und GD32F303
mit dem Logic Analyzer mitgeschnitten. Es sieht tatsächlich so aus, als
würde der NRF nur "stupide" als Transceiver benutzt.
Ich vermute, wie du oben beschrieben hast, dass die Logik im Gigadevice
sitzt und der ESP ebenfalls nur als Gateway zur Cloud dient. Die DTU
stellt übrigens auch permanent ein WLAN zum direkten Zugriff bereit per
App (das ist eher unschön, wenn man das Ding dauerhaft im Einsatz hat).
Die bisherige Untersuchung zeigt, dass die Pakete "on air" 1:1 den
seriellen Datenpaketen entsprechen. Jetzt geht es also darum, aus den
seriellen Daten schlau zu werden. Ein paar Randbedingungen konnte ich
schon klären, z.B. kommt immer die Seriennummer des Inverters bzw. der
DTU im Paket vor (Absender und Empfänger-Adresse).
Leider habe ich im Moment wenig Zeit, weiter an dem Protokoll zu
forschen.
Ich versuche euch demnächst mal eine Excel-Tabelle mit den
aufeinanderfolgenden Paketen bereitzustellen, vielleicht könnt ihr mit
den Daten bereits was anfangen. (Einschalten der DTU, Verbindung zum
Inverter, Regelmäßige Abfrage).
martin schrieb:> Ich versuche euch demnächst mal eine Excel-Tabelle mit den> aufeinanderfolgenden Paketen bereitzustellen,
Das wäre spitze. Einfach mitschneiden. Muss nicht aufwendig aufbereitet
sein. Eventuell kannst Du auch einfach ein Terminalprogram (HTerm o.ä.)
aufzeichnen lassen. Was auch super funktioniert sind diese Saleae
Logik-Analyser, falls Du zufällig so einen hast. Wäre doch gelacht, wenn
wir bei diesen Erkenntnissen und der Vorarbeit dem Protokoll nicht
vollends auf die Schliche kommen würden!
Bin auch dabei, wenn genügend Daten über die Kommunikation da sind, an
einem Klon mit zu programmieren. Man müßte halt vom 1. Anschalten der
DTU, über Registrierung des WR bis hin zur dauernden Übertragung der
Daten von WR zu DTU mal alles aufgezeichnet haben. Verschlüsselt ist da
wohl nichts, sonst könnte man die Seriennrn nicht rauslesen. Bin schon
ganz gespannt auf die Daten!
Hab mir die Bedienungsanleitungen für die DTUs mal durchgelesen. Sieht
mir so aus, als müsse es eventuell gar keine "Verbindungsaufnahme" o.ä.
geben.
Der DTU sagt man einfach, welche Seriennummern die Wechselrichter haben,
und die DTU fragt dann regelmäßig alle eingetragenen Wechselrichter ab.
Insofern also "einfach" mal die RX und TX Bytes für einige Zeit
mitschneiden (ein ganzer Tag wäre ultimativ), dann sehen wir hoffentlich
irgendwelche Muster in der Payload, über die wir dann auf den Inhalt
schließen können.
Super Projekt das ihr da Versucht umzusetzen.
Ich habe seit ein paar Tagen einen HM700 und eine DTU WLite. Ich habe
allerdings sogar das Probelm das die DTU bei mir gar nicht richtig
hochfährt und ich nur ein WLAN das AiThinker heisst angezeigt bekomme.
Fahre ich ein paar Kilometer weit weg, fährt der Stick hoch und zeigt
mir das DTU WLAN an. Habt ihr dazu eine Idee? Eine Alternative zu dem
Stick wäre mir auch am liebsten! Die Cloud braucht ja keiner ;)
LG
Martin
Hab ich mir am Anfang auch gedacht, nur sind fast keine anderen WLAN
Signale in der nähe. Hab dann auch schon mein eignes Mesh Wlan
abgedreht, bringt keine Besserung. Auch in der restlichen Ortschaft
funktioniert es nicht. Nur beim Bahnhof... sehr strange das ganze...
Aber egal, ich beobachte eure Vortschritte weiter, der Stick geht aber
auf jeden Fall wieder zurück.
LG
Martin
Hallo,
ich würde sehr gerne helfen, da ich auch einen HM-400 habe und dessen
Daten auslesen möchte. Ich hab den Thread hier schon verfolgt, aber
bisher noch keinen Code gesehen. Wie schafft Ihr es, dass der
Wechselrichter antwortet? Ich würde sehr gerne helfen und die Antworten
des Wechselrichters auswerten / analysieren. Derzeit bekomme ich aber
noch nicht mal eine Antwort.
martin schrieb:> Ich versuche euch demnächst mal eine Excel-Tabelle mit den> aufeinanderfolgenden Paketen bereitzustellen, vielleicht könnt ihr mit> den Daten bereits was anfangen.
Hallo zusammen,
im Anhang findet ihr eine Excel-Tabelle mit Daten die ich vor kurzem
aufgezeichnet hatte. Es handelt sich dabei um die INTERNE Kommunikation
in der DTU zwischen dem GD32 und dem NRF - die ersten 15 Sekunden nach
Einschalten.
Diese Daten entsprechen nach meinem Kenntnisstand fast 1:1 der
Funkkommunikation mit dem Inverter (siehe Tab 3 in der Excel).
Einiges, was ich identifizieren konnte, habe ich bereits markiert -
vielleicht könnt ihr weitere Teile entschlüsseln. Leider ist es nicht
ganz so offensichtlich, wo sich die Daten zu Strom, Spannung und
Leistung wiederfinden lassen.
Aber vielleicht könnt ihr mit diesen Infos ja bereits einen NRF mit
eurem Inverter kommunizieren lassen. Ich vermute, dass die Kommunikation
von der DTU initiiert werden muss, da man dort die Seriennr. des
Inverters einträgt. Der antwortet dann nur, wenn er seine Nummer "hört"
(ab dem 2. großen Kommunikationsblock im Tab 2).
Hallo Martin,
vielleicht eine blöde Frage, aber hast du mal mit einem Hexeditor auf
die Rohdaten geschaut? Vielleicht erschließt sich da ein Muster? Die
Aufbereitung in Excel ist Klasse für die Doku, aber für das Handling der
Daten finde ich es eher unpraktisch. Vielleicht kannst du auch noch die
Rohdaten als Binärfiles zur Verfügung stellen?
Da ich mittelfristig eh einen zweiten HM brauche, habe ich gestern einen
bestellt. Dann kann ich den "unter den Schreibtisch" legen und komme
vielleicht auch weiter. Vom Dach empfange ich keine Daten, bzw. kann sie
in all den "Stördaten" nicht identifizieren. Ich würde es dann mal mit
HM und dem NRF24 in einer "Blechkiste" zur Abschirmung versuchen. Sendet
der HM eigentlich auch Daten, wenn die Panels nichts liefern?
VG
Carsten
Carsten B. schrieb:> hast du mal mit einem Hexeditor auf> die Rohdaten geschaut? Vielleicht erschließt sich da ein Muster?
Hallo Carsten,
habe deinen Vorschlag mal mit den vorhandenen Daten umgesetzt, siehe
Binary anbei. Mit HxD war auch kein Muster direkt erkennbar, neben dem
von mir bereits markierten Aufbau der Datenpakete. Wegen der verschieden
Länge der Pakete habe ich diese jeweils mit 00 aufgefüllt - so sieht es
wenigstens angenehmer aus ;-)
Marcel schrieb:> Wie schafft Ihr es, dass der> Wechselrichter antwortet?
Hallo Marcel,
mit einem eigenen NRF hat es bisher noch keiner hier geschafft.
Ich hatte mir die DTU ("Data Transfer Unit"?) vom Hersteller gekauft, um
damit das Protokoll abzufangen und analysieren zu können. Darin werkelt
ebenfalls ein NRF auf den ich mich in meinen bisherigen Texten bezogen
habe.
Hi,
ich bin auch am Überlegen mir eine PV zu kaufen. Die meinsten Angebote
sind mit dem HM Wechselrichtern. Für die Integration in meine
Hauselektronik will ich aber keine Cloud. Daher kommt mir der Bertrag
sehr gelegen. Mal sehen, wo ich helfen kann.
Ich hab mir mal die Binärdaten angesehen und noch Werten gesucht, welche
normalerweise stabil sind. (Netzfrequenz und Netzspannung)
Wenn mich nicht alles teucht, könnten es die Bytes (Big-Endian) im
Screenshot sein.
Gruß
Pascal
PS: Hier gibt es noch die Modbus Register der DTU Pro. Vielleicht läst
sich daraus etwas ableiten.
https://www.shinetech-power.de/wp-content/uploads/2021/07/Technical-Note-Modbus-implementation-using-3Gen-DTU-Pro-V1.2.pdf
Hallo Pascal,
sehr gut, das sind schon mal hilfreiche Infos - das erste Byte nach den
Seriennummern scheint zu kennzeichnen, welche Werte folgen.
Bei den von dir vermuteten Netz-Ausgangsdaten (scheint zu passen) war es
jeweils die ID 0x02 an Byte[10].
Hallo Pascal,
stimmt. Auf den ersten Blick würde ich vermuten, dass es an der Abfrage
durch die DTU liegt.
Die 0x80 an Byte[10] heißt wohl lesen - danach folgt i.d.R. die 0x0B für
Ist-Werte. In dem von dir genannten Fall (Spalte AW) ist es aber die
0x11.
Es dürften also irgendwelche anderen Werte folgen.
Pascal A. schrieb:> hast du noch mehr Daten zu deinem Wechselrichter?> Vielleicht sind es Daten zu Einstellungen, Firmware, ...
Hallo Pascal,
morgen kann ich dir mehr sagen - heute komme ich nicht dazu, weil mein
Wechselrichter leider noch nicht fest installiert ist. Ich würde ihn ja
gerne mit einem DC-Netzteil testen, habe aber Bammel, dass ich ihn
dadurch abschieße...
martin schrieb:> Ich würde ihn ja> gerne mit einem DC-Netzteil testen, habe aber Bammel, dass ich ihn> dadurch abschieße...
Spannung im zulässigen Bereich und passende Strombegrenzung - dann kann
nichts passieren. Am besten die Spannung niedrig halten damit der MPPT
noch nicht arbeitet. Dann kannst du wunderbar verschiedene nahezu
konstante Bedingungen schaffen und die zugehörigen Daten untersuchen.
Hallo,
ich bin auch interessiert, da eine Anschaffung geplant ist.
Ich habe mir die Daten auch mal angeschaut.
Der 'PackageCounter' und die drei davorliegenden Bytes sind die Uhrzeit
in BigEndian time_t 32-bit => 13.02.2022 13:16:04.
Sieht man in der Oberfläche die Today Production / Total Production in
Wh?
Laut Modbus Beschreibung sollten dies 2 bzw 4byte sein.
Interessant sind die beiden vorletzten Bytes vor dem 0x7F;
ggf auch eine Art zusätzliche Prüfsumme? Das Byte direkt vor dem 7F ist
ja eine CRC8.
Hilfreich wäre m.E. auch mal eine andere Seriennummer zusätzlich zu
probieren um zu sehen was sich bei der Anfrage hier ändert.
VG
Frank
Super!
Ich habe mal versucht, die bisherigen Erkenntnisse in der angehängten
Textdatei zusammenzufassen. Vielleicht gewährt das ja noch neue
Einblicke. Gerne erweitern!
Das 1. Init (mit den 8 Nullen) scheint mir eine Broadcast zu sein, aber
über welche Adresse wird das verschickt?
In meinem Testprogramm habe ich's mit der Adresse der DTU versucht, denn
Adresse WR ist ja noch nicht bekannt, aber der sch... WR antwortet
einfach nicht.
Hubi schrieb:> In meinem Testprogramm habe ich's mit der Adresse der DTU versucht, denn> Adresse WR ist ja noch nicht bekannt
So wie ich das Verstanden habe gibt man die Seriennummer(n) der WR in
der DTU (oder in der Cloud) ein bevor eine Kommunikation möglich ist.
Dadurch wäre die Adresse des WR schon bekannt.
Aber andererseits antwortet der WR mit der Adresse der DTU. Die ja nicht
bekannt wäre wenn die nicht im ersten Frame enthalten wäre.
Könntest du ggf. dein Testprogramm sharen? Habe hier einen HM-1500 sowie
NRF24 Module. (nur aktuell noch keine Zeit gehabt einen Testaufbau zu
machen bzw. Abends ist der WR meist schon aus)
Hallo Thomas
so wie ich die Excel-Tabelle verstanden habe ist das ein Mitschnitt
innerhalb der DTU, also zwischen der "CPU" und dem NRF. Und diese
Kommunikation startet mit 7E und endet mit 7F. Aber Martin kann das
bestimmt klären.
Wir müssen unterscheiden zwischen
(a) den Nachrichten zwischen dem GD32F303 und dem NRF24LE1E [1], und
(b) den Nachrichten, die der µC im NRF24LE1E an den darin eingebauten
"nRF24L01+"-kompatiblen Transceiver sendet.
Martins Radio-Mitschnitt hat bewiesen, dass der "nRF24L01+"-Teil nach
dem Nordic "enhanced Shockburst" Protokoll funkt.
Dieses beinhaltet insbesondere immer eine Zieladresse. Siehe [1],
Kapitel 3.4.3:
- Preamble 1 byte
- Address 3-5 byte
- Packet Control Field 9 bit
- Payload 0-32 byte
- CRC 1-2 byte
Für Shockburst gibt es leider keinen einfachen (d.h.
NRF24LE1E-basierten) "Sniffer", um alle Nachrichten mitzulesen. Daher
das weiter oben erwähnte Projekt in [2].
Unser Ziel ist ja wohl, mit einem einfachen "nRF24L01+" direkt mit
einem/mehreren Wechselrichtern zu sprechen.
Dazu müssen wir zu jeder der von Martin zwischen GD32F303 und NRF23LE1E
mitgeschnittenen Nachrichten auch wissen, wie diese Nachricht
schließlich (als "enhanced Shockburst"-Nachricht) versendet wird.
Glücklicherweise scheint es sich herauszukristallisieren, dass die
beiden sich sehr ähnlich sind.
Alternativ könnte man eventuell an diese Pakete "direkt" drankommen,
wenn man im Wechselrichter mitliest - was ist denn dort verbaut? Auch
ein NRF24LE1E, oder eventuell ein "nRF24L01+" Transceiver?
Ich könnte mir auch gut vorstellen, dass gewisse Nachrichten übernaupt
nicht an den Transceiver (und somit in den Äther) gehen, so zum Beispiel
die "Init" Nachricht. Vielleicht ist das lediglich eine Nachricht an den
NRF24LE1E à la "mach' Dich bereit" oder so?
-- petersilie
[1] https://infocenter.nordicsemi.com/pdf/nRF24LE1_PS_v1.6.pdf
[2] https://github.com/Yveaux/NRF24_Sniffer
petersilie,
du hast recht. Ich hatte verdrängt das auf den NRF24 selbst auch noch
Logik vorhanden sein kann.
Ich würde jetzt mal unterstellen, dass der WR immer auf seine
Seriennummer (= Adresse) lauscht und der DTU ebenfalls auf seiner
Seriennummer.
In Init 1 (siehe deine Text File) würde die DTU zwar an die Adresse des
WR ein Paket senden aber der WR würde nicht wissen an welche Adresse er
antworten soll. Dies ginge erst ab Init 2 weil dort die DTU seine eigene
Adresse an den WR schickt.
Bei der Durchsicht des Datenblattes [1] ist mir noch etwas im Kapitel
3.4.3.3 aufgefallen. Dort wird u.a. das No Acknowledgment flag
beschrieben.
Im Post Beitrag "Re: Wechselrichter Hoymiles HM-xxxx 2,4 GhZ Nordic Protokoll?" wird
beschrieben das das PCF 0D8 (== b011011000) ist. Was ja bedeutet das
NO_ACK 0 ist.
"Setting the flag high, tells the receiver that the packet is not to be
auto acknowledged."
Es ist low, also muss AutoAck true sein. Das wäre zumindest etwas was
mir im Code von Hubi aufgefallen ist.
Ebenso wird im oben genannten Post beschrieben das Channel 3 verwendet
wird.
Ich hab mir jetzt mal solche NRF24-Platinchen geordert. Wir kennen die
verwendeten Adressen. Somit können wir doch einen NRF24 auf die gleiche
Adresse konfigurieren wie den Wechselrichter. Dann sollte der doch genau
die Pakete von der DTU empfangen, oder was meint ihr?
Damit hätten wir dann einen 1:1 Mitschnitt der tatsächlichen Pakete in
die Richtung DTU --> WR.
Später drehen wir das Spiel um, und konfigurieren den NRF24 auf die
Adresse des DTU. Und hören wiederum zu.
Eventuell macht das "auto-ACK" Probleme - das man eventuell
empfängerseitig nicht abschalten kann. Aber vielleicht reicht es, den
"Zuhörer" schön weit weg zu platzieren, damit das ACK vom echten
Empfänger gewinnt.
Leider habe ich (noch) keinen WR/DTU. Lieferprobleme überall. Wenn das
mit den NRF24 klappt, könnte ich eventuell einen vorkonfigurierten Raspi
zur Verfügung stellen, den dann ein stolzer Besitzer einer DTU (Martin?)
mal lauschen lassen könnte...
Hubi hat ja wohl auch nur einen WR, aber keine DTU. Da ist nach den
bisherigen Erkenntnissen mit Zuhören allein wohl leider nichts zu holen,
da der WR ohne passende Frage auch nie antwortet.
Hallo zusammen,
gestern hatte ich versucht, den Wechselrichter mit einem Netzteil zu
speisen - leider hat mir der MPP-Regler dazwischengefunkt und es hat
sich kein stabiler Arbeitspunkt eingestellt. Ich glaube, es wird doch
endlich mal Zeit für ein ordentliches Labornetzteil...
Freut mich, dass hier so viele helfen, das Protokoll zu knacken. Aber
ich glaube, es herrscht hier noch ein bisschen Unklarheit über die von
mir bereitgestellten Daten.
Deshalb nochmal ein Schema zur Klarstellung. Die obige Excel/Binärdaten
zeigen die serielle Kommunikation innerhalb der DTU! Der NRF24LE1E
ändert diese Pakete nochmal ab, bevor er sie an den Inverter
rausschickt, inklusive Neuberechnung der CRC8.
Die Initialisierungssequenz dürfte also nur dazu da sein, den NRF24LE1E
mit den benötigten Adressen zu versorgen. Die erste Kommunikation "on
air" beginnt dann erst nach den 3 Init-Sequenzen - das wäre der
Ansatzpunkt, den jeder mit einem Inverter und ein paar NRF24 Modulen mal
in Angriff nehmen könnte:
-Enhanced Shockburst (ist voreingestellt)
-CRC 2 Byte
-250 kbit
-Kanal 3, 23, 40, 61 oder 75
-Paketlänge 27 Byte
-Empfänger-Adresse: Letzte 8 Stellen Inverter Seriennr. BCD in "Little
Endian"
Und wenn dann das im Bild dargestellte Datenpaket gesendet wird, müsste
euer Inverter theoretisch antworten.
Macht er aber nicht!
Ich habe folgendes
15 72 60 79 52 72 81 88 32 80 B 0 62 9 4 9B 0 0 0 0 0 0 0 0 2 29 31
an addrWR[5] = {0x52, 0x79, 0x60, 0x72, 0x01} gesendet, aber das
Drecksding muckst sich nicht.
Meine Seriennummer WR ist xxxx72607952.
Die 31 ist die CRC8 der vorangehenden Bytes.
Das sollte doch alles passen!?
Hallo Hubi,
ja, die Sequenz sieht m.M.n. richtig aus. Hast du es mal auf den anderen
Kanälen probiert?
Ist das in deinem Beispielcode enthalten? Dann könnte ich es mal bei mir
probieren.
Oder es könnte doch noch weitere Inbetriebnahmeschritte geben.
Vielleicht wird die DTU-Adresse bei der Einrichtung per S-Miles App im
Inverter gespeichert?
Dazu müsste ich das ganze Setup nochmal neu machen, während ich die
Pakete mitschneide.
Habe alle Kanäle ausprobiert, aber nix. Vllt ist auch die Entfernung zum
WR zu groß. Sende hier vom Wohnzimmer durch Glastür in Richtung
Gartenhaus mit dem WR aufm Dach.
Im Anhang nochmals das Testprogramm.
Als RF24 Lib benutze ich die von TMRh20
und die CRC-Lib findet man hier https://github.com/RobTillaart/CRC (bin
zu blöd um Link einzufügen)
Hello all,
First of all, I don´t speak german, so I am following this thread using
google translator, it´s not a problem for me. I have a DTU-W100 and five
MI-1500 microinverters.
I have flashed a Logitech Unifying Dongle with the firmware from this
repo
https://github.com/BastilleResearch/nrf-research-firmware
I left it running on channels 1,3,6,9,11,23,40,61 and 75 for all night,
I don´t know if logged packages came from PV system. The dongle is a bit
far from the MI and DTU, but today morning I put it about 2-3 meters
from two MI-1500 and now I waiting for new data, but the code use DWELL
for channel scanning, so probaly I am losting some packages.
If anyone need a specific channel scanner or sniffer or any other test,
I can help in my spare time.
I hope this project will go forward!
Hi Arnaldo,
Welcome to the party!
Thanks for offering to help out with scanning/sniffing, and thanks for
providing some results already!
Looking at the received packets, it seems to me that these are unlikely
to be coming from your MI-1500s for the following reason:
I think we have already established that the devices (DTU/MIs) use the
last 8 decimal digits of their respective serial numbers converted to
BCD code as their "Shockburst" address. This implies that the address
will never contain any of the hex digits A...F.
From your list, this only leaves a handful (if your hand happens to be
six-fingered, that is) of packets, but these don't look familiar:
However, knowing the address that the inverters use means that we should
be able to "sniff" specifically for packets to/from those addresses.
I am not familiar with the "nrf-research-firmware" tools, but it appears
to me that you might be able to use the "nrf24-sniffer.py" tool to
specifically follow packets sent to/from a particular address.
If your DTU serial number is, say, xxxx12345678, then this address
should be 0x78,0x56,0x34,0x12 (possibly followed by 0x01 - not sure
about that).
But first, let's see what today's data contains!
Very excited about this project gaining more participants.
-- petersilie
Hello Arnaldo,
thanks for the dump. I can see that your dump was mainly during the
night. If i’m correct, the Hoymiles is not active in the night because
the required start voltage is not generated by the solar panels. It
would be beneficial if you try to “sniff” during a more or less sunny
day. Even the last 5 byte pairs of your devices and DTU could be helpful
for analyzing the dump.
Thanks a lot
Marcel
@hubi,@tbnobody
Zumindest was den Kommentar in Zeile 35
(Beitrag "Re: Wechselrichter Hoymiles HM-xxxx 2,4 GhZ Nordic Protokoll?")
angeht ("// !!!! muss false sein sonst klappt senden nicht") kann ich
Euch glaube ich beruhigen. Das Senden geht nicht schief, wenn Auto-ACK
aktiviert wird. Vielmehr gibt die write()-Funktion zurück, ob ein ACK
empfangen wurde (true), oder eben nicht (false), siehe [1].
Somit geht zwar das Senden nicht schief (das Senden gelingt wohl laut
Spezifikation "immer"), aber der WR antwortet nicht (mit einem ACK).
[1]
https://nrf24.github.io/RF24/classRF24.html#a4cd4c198a47704db20b6b5cf0731cd58
@martin
Bist Du sicher, dass die Pakete 5-Byte-Adressen verwenden, und nicht
etwa nur vier?
Mir fiel nämlich auf, dass "Shockburst" das Einstellen der Adresslänge
(zwischen 3 und 5 Bytes) zulässt. Die RF24-Lib hat dazu die Funktion
setAddressWidth() ([1]).
Es scheinen ja nur die letzten 8 Dezimalziffern der Seriennummer in die
(ersten vier Bytes der) Adresse umgesetzt zu werden. Bisher haben die
Versuche oben dann als fünftes Byte ein "0x01" genommen, aber wo kommt
das her? Hast Du das so auf dem Funk gesehen, oder ist das geraten?
[1]
https://nrf24.github.io/RF24/classRF24.html#ad5aea7f9a3bd9c7d357fb296ce751f21)
Hallo Petersilie
habe mir den Source-Code angesehen und bin zu gleicher Erkenntnis
gekommen. Mich hat halt nur gestört, dass das Senden immer das Ergebnis
false lieferte. Aber was ist nun besser fürs testen, mit AutoACK=TRUE
und Ergebnis=false oder doch besser Ack abschalten? Frage weil du halt
geschrieben hast dass wohl AutoAck eingeschaltet ist laut deiner
Mitschnitte (im PCF)? Bist du da sicher?
Was "besser" ist, ist eine gute Frage.
Tatsache ist, es ist sehr unwahrscheinlich, dass der WR antworten wird,
wenn er nicht einmal ein ACK sendet. Insofern würde ich sagen, es ist
"besser", mit eingeschaltetem AutoACK zu arbeiten.
Die Mitschnitte sind von einem anderen Martin - insofern muss ich die
Frage weitergeben, ob das ACK-Bit in der beobachteten Kommunikation
wirklich gesetzt ist, oder nicht...
-- petersilie
I attached the log from today, I think tomorrow I will listen just on
channel 1, or if someonte have another idea please tell me.
@parsley
it´s my first time using the nrf-research-firmware tools, so I am trying
to do something that can help, I need to identify a address and after it
sniff just this address with nr24-sniffer.py.
To add a MI in hoymiles plataform you need to use the serial number of
the MI so, I think, it is used to reach the device using the serial
number.
@Marcel
yes, the dump was done in the night, because I flashed the dongle after
the work and leave it running to try to catch something... today I got
a few packages, I really don´t know if it´s working as expected, but the
main reason, I think, is because the DWELL for each frequency, tomorrow
I will leave it on channel 1 and after I post the result here again....
last 5 bytes of the serial DTU and the nearests MI1500
DTU: 35453
MI1500: 36590
MI1500: 14456
@arnaldo_g
Your nrf-research sniffing efforts are much appreciated. This certainly
has the potential to be very helpful indeed.
Unfortunately, there might yet be some obstacles to overcome:
I noticed that the "nrf24-scanner.py" uses "promiscuous mode" (which by
itself seems to be a major hack, see posts above). This should not
necessarily be a problem, since we think we know the addresses of the
devices involved, and can therefore listen for packets specifically
addressed to these.
But to make matters worse, it seems to me that the on-air bitrate is
hardcoded to 2 MBit/s
(https://github.com/BastilleResearch/nrf-research-firmware/blob/02b84d1c4e59c0fb98263c83b2e7c7f9863a3b93/src/radio.c#L41).
The Hoymiles inverters communicate at 250 kbit/s, so until you can
switch the sniffer to that lower bitrate, you won't be seeing any
meaningful data.
@martin, hattest du auch schon den traffic zwischen WR und DTU "in the
air" mitgeschnitten? Ich frage mich nur, ob da das 5. byte auch immer
0x01 ist wie bei der Kommunikation zwischen DTU und WR. Nicht das hier
noch ein Problem liegt
@arnaldo_g
Another quick note regarding addresses. You helpfully list the serial
numbers of your devices:
> last 5 bytes of the serial DTU and the nearests MI1500> DTU: 35453> MI1500: 36590> MI1500: 14456
However, you will need the last 8 (not 5) digits to determine the
address:
> DTU: 35453 --> Address will be 0x53,0x54,0x?5,0x?? (,0x01)> MI1500: 36590 --> Address will be 0x90,0x65,0x?3,0x?? (,0x01)> MI1500: 14456 --> Address will be 0x56,0x44,0x?1,0x?? (,0x01)
Hi!
@petersilie, you are right the datarate is wrong!
Thanks for the support, I recompiled the firmware for 250K and flashed
the dongle again, and now I am seeing some packets with the serial
numbers of MI, see the attached file, now I think we can go forward, I
know the data is update at Hoymiles every 15 minutes the last number in
address is always xx:xx:xx:xx:01. The dongle with this results is far
from the MI, I will take it close again. If anyone have a idea to what
channel/address to scan I can provide it.
Brilliant!!!
These all appear to be messages from your DTU (serial number
...70:53:54:53) to various inverters.
They're all 11 Bytes long, and we're not seeing any replies.
Maybe some sort of "ping"?
Are your inverters running?
Not sure why we think that the DTU only communicates on the given
channels (1 3 6 9 11 23 40 61 75).
My guess is that maybe the channels are selected based on serial number.
Or maybe they are switched dynamically somehow...
Maybe you could try monitoring "all" available channels? Not sure how
well that will work though - since at any given moment in time you will
likely be looking at the "wrong" channel!
@petersilie @arnaldo_g,
if all the messages are from the DTU towards the inverter we have a new
message id.
In this document:
https://www.mikrocontroller.net/attachment/549922/hoymiles-datenformat-r2.txt
and also in martins excel the MID 0x83 was only shown as a response form
the inverter towards the DTU. But now we see 0x83 also from the DTU
towards the inverter. 0x82 seems to be completly new
My inverters are running, attached a new log from a closest place with
more log.
This is the DTU: [2022-03-12 09:17:15.329] 40 0 90:65:23:74:01
I am running a scanner on all channels, but it´s seens losting a lot of
package, I will leave it running for some hours and post here after!
Thanks Arnaldo,
just to clarify. In an older post you wrote, that your serial number of
your DTU ends with 35453 ?
> DTU: 35453> MI1500: 36590> MI1500: 14456
But in your last post, you wrote "90:65:23:74:01". For me there are no
similarities. Would you be so kind and give us the last 8 digits of the
serial number from your DTU and your Hoymiles please ?
Thanks a lot for your work
Marcel
Marcel,
Sorry I made a mistake, is not that line, see below, you can see it in
last log nrf24_4.txt file, the serial is 70535453.
[2022-03-12 09:16:58.926] 23 0 53:54:53:70:01
this is another MI.
[2022-03-12 09:17:15.329] 40 0 90:65:23:74:01
I just wrote a small parser to analyze the data from @arnaldo_g.
It's maybe easier to find some logic in the channel selection.
Unfortunatly it seems that all messages from the inverters to the DTU
are empty.
Correct, the reason for this result is that arnaldo is using the
scanner. This one only shows the connections between the devices. Based
on the code it analyses only the first bytes of the protocol.
Arnaldo (@arnaldo_g) can you use the ./nrf24-sniffer.py. I'm not quite
sure about the params.
Maybe
./nrf24-sniffer.py -a 90:65:23:74:01
or
./nrf24-sniffer.py -a 53:54:53:70:01
I think this should result in a more detailed output.
Marcel
Hi all!
seens the firmware for the dongle have some hardcoded parameters, I
leaved it running for about a hour and nothing was catch by sniffer,
after I analysed the code and change another point to 250K, maybe it
need some ajusts to sniff the packages.
I also changed (in radio.c / line 388) to RATE_250K recompile and
reflashed the device, but running "./nrf24-sniffer.py -a 36:49:51:70:01"
nothing is recorded...
// 2Mbps data rate, enable RX, 16-bit CRC
configure_phy(EN_CRC | CRC0 | PRIM_RX | PWR_UP, RATE_2M, 0);
If anyone is familiar with the radio and it´s parameters can look the
code, maybe can help more!
If someone have a idea please let me know to try again....
Grasping at straws here, but you could try reversing the order of the
bytes to the -a parameter:
1
./nrf24-sniffer.py -a 01:70:51:49:36
(The source code reverses them before passing them on to the underlying
layer "enter_sniffer_mode()", but it appears to do no such thing when
printing the results coming from there.)
Martin G. schrieb:> Grasping at straws here, but you could try reversing the order of the> bytes to the -a parameter:>>
1
./nrf24-sniffer.py -a 01:70:51:49:36
>> (The source code reverses them before passing them on to the underlying> layer "enter_sniffer_mode()", but it appears to do no such thing when> printing the results coming from there.)
Martin, about a hour running and nothing was logged.....
root@retropie:/home/pi/nrf-research-firmware/tools# date
Sat 12 Mar 17:09:04 -03 2022
root@retropie:/home/pi/nrf-research-firmware/tools# ./nrf24-sniffer.py
-a 01:70:51:49:36
Hallo
um sichern zu sein, dass meine Pseudo-DTU (Arduino ProMini + nRF24L01)
funzt, habe ich mir ein Testprogramm geschrieben, das den WR simuliert.
FDaten kommen an, ich setzte das Bit 8 und sende an die "DTU" zurück.
Und die kriegt das auch, zwar nicht bei jedem Senden, aber wenigstens
kommt was an. Und ich bin sicher, dass meine Hardware funktioniert.
Aber weiterhin kommt von richtigen WR aufm Gartenhaus nix. Ich vermute
entweder eine spezielle Einstellung der RF24-Parameter oder eine
spezielle Sequenz von Telegrammen von DTU->WR.
Meine RF24-Parameter sind:
Kanal 3
Speed 250000 kbps
payload=27
autoAck=true
adressbreite=5
Sollte doch passen, oder?
Hallo, eine Frage an diejenigen, bei denen es scheinbar schon ein
bischen klappt mit dem Senden / Empfangen:
Welches nrF24 Modul nutzt Ihr ? Es gibt ja verschiedene ? Ich wollte
mir eines bestellen.
Danke.
Einen schönen Sonntag wünsche ich Dir / Euch.
ich habe hier ein ali-005
@Hubi: das mit der Kanalauswahl ist sehr seltsam. Weil bzgl. der Dumps
von @arnaldo_g scheinen ja alle möglichen Kanäle involviert zu sein.
Wann welcher ausgewählt wird ist mir noch nicht klar.
Hallo,
Ich warte auch noch auf meine Hardware; hier einiges was mir beim Lesen
der Beiträge durch den Kopf ging:
nrf24_5.txt from Arnaldo shows me channel 3, 23, 40, 61, 75 & 83 are
used.
In nrf24_4.txt we have a lot of packages with the address of the DTU and
zero payload. Could this be ACK packages from the DTU to the WR?
When the WR answers, could it be, that it uses the address of the DTU?
However we see only data from the DTU. Maybe the usb sniffer has a
'weak' antenna.
@arnaldo_g
Could you repeat what you did for nrf24_4.txt for channel 3, 23, 40, 61,
75, 83 but put the sniffer as near as possible (minimum wall in
between) to one of the MIs?
@hoymiles-datenformat-r3.txt
Regarding the first xlsx from martin I think []=Spekulation:
0x80 "Zeit setzen", Antworten (Anfragetyp 0x0B): [0x01, 0x02, (0x83)]
0x81 "Anfrage DC-Daten", erwartete Antwort: 0x01
0x82 "Anfrage AC-Daten", erwartete Antwort: [0x02]
VG
Frank
Frank H. schrieb:> Hallo,> Ich warte auch noch auf meine Hardware; hier einiges was mir beim Lesen> der Beiträge durch den Kopf ging:>> nrf24_5.txt from Arnaldo shows me channel 3, 23, 40, 61, 75 & 83 are> used.> In nrf24_4.txt we have a lot of packages with the address of the DTU and> zero payload. Could this be ACK packages from the DTU to the WR?> When the WR answers, could it be, that it uses the address of the DTU?> However we see only data from the DTU. Maybe the usb sniffer has a> 'weak' antenna.> @arnaldo_g> Could you repeat what you did for nrf24_4.txt for channel 3, 23, 40, 61,> 75, 83 but put the sniffer as near as possible (minimum wall in> between) to one of the MIs?>> @hoymiles-datenformat-r3.txt> Regarding the first xlsx from martin I think []=Spekulation:> 0x80 "Zeit setzen", Antworten (Anfragetyp 0x0B): [0x01, 0x02, (0x83)]> 0x81 "Anfrage DC-Daten", erwartete Antwort: 0x01> 0x82 "Anfrage AC-Daten", erwartete Antwort: [0x02]>> VG> Frank
Hi Frank, I tried the sniffer in the same place but I can´t get
anything, I think the code for the sniffer have something different...
The distance for the DTU is about 3 meters and for 1 MI is about 1
meter, for another MI 1,5meters and the others is about 4-5 meters....
the wall is just a thin wooden about 4-5mm.....
Yes the antenna of the sniffer is tiny, it´s a logitech unify dongle,
but for 250k and the frequency it´s should work nice... When using the
dongle with the logitech keyboard I can go far and it´s still
working....
Also I have tried some changes on scripts and code of the
nrf-research-firmware but no luck, I think the sniffer is not working,
maybe because the CRC, payload or another radio configuration....
Hi! More one log, I think it will not help anything, but just to see the
difference, I changed the script parameters and run it, then I runned
the original code.....
I agree with arnaldo_g, fh_, etc. There might well be some setting that
we're missing - therefore we're not seeing the packets we expect to see.
CRC and Baud Rate settings seem fine to me.
Not sure what to do about the different channels. Until we figure out
how the devices "hop" between channels, we will miss packets. But we
should be able to see at least some. It would be interesting to see if
the inverters always stay on the same channel, or if they switch
channels...
"martin (Gast)" seems to have the most insight into how the RF side of
things work. Maybe he has some more ideas?
Also, maybe the Logitech dongle isn't quite the same as an "NRF24L01+",
and the nrf-research-firmware definitely has some quirks.
I bought some NRF24L01+ modules and will try to interface them to a
RaspberryPi. This might give better results.
@arnaldo_g - do you have any NRF24L01+ modules that you could try
instead of the Logitech dongle?
Hi Martin,
I have a Nrf24l01 module that I buyed, and put on my drawer to wait the
results, when I found this forum.... :)
After that I found the nrf-research-firmware, and I found a Logitech
dongle that can run it... And started with some test and put the results
here...
This Logitech dongle model C-U0007 seens to have a NRF24L01+ IC, but I
don´t have much time to code a new firmware and try....
Another thought: Could we try to "ping" the known addresses, cycling
through "all" channels? I believe the NRF24s should answer to a "ping"
(empty payload) all by themselves.
I should be able to try this with my NRF24s in a couple of days' time.
Hi Guys,
sorry for my late reply - I have a roof reconstruction going on at home,
so little time for playing with my inverter and no panels installed at
the moment ;-)
As I mentioned in my post
Beitrag "Re: Wechselrichter Hoymiles HM-xxxx 2,4 GhZ Nordic Protokoll?" I got good results
with the NRF sniffer from yveaux. Since you have dedicated addresses and
CRC checked packages, you can filter out a lot of garbage. Downside is,
that you can only sniff one side of the communication (per computer - so
I have to setup a second one to sniff both sides).
As you can see in the wireshark screenshot, the packets are
acknowledged. So ACK is on.
@Arnaldo: I would limit sniffing to the channels 3/23/40/61/75 since
these are approved in the FCC report and I have verified them with a
spectrum analysis.
see:
Beitrag "Re: Wechselrichter Hoymiles HM-xxxx 2,4 GhZ Nordic Protokoll?"
My guess(!) about the channels is, that the information is redundant.
That would mean, the DTU hops to every channel and transmits the same
information - to have a chance of getting data even in wifi contaminated
areas. So for the beginning, it should be sufficient to focus on one
channel.
A first glance at the RF data on channel 23 instead of 3 seems to
support my guess.
Hi everyone,
I started another quick test without the inverter (DTU trying to
connect), to compare the serial data on the DTU with the RF packets
sniffed with Wireshark.
An important part in the request by the DTU seems to be coded in the
last 2 Bytes before the CRC8. They alter with the time stamp, but I have
no idea what they encode. Maybe some flags?
Hi,
I also join the party as I'll receive soon a HM-600 inverter. I don't
favour cloud services and try to keep my data in-house.
Concerning the last two bytes before the CRC:
Is that lower nibble of the first byte always "B"?
To me it seems unlikely to put changing flags in an initial connect
request which contains the same data besides the changing time stamp.
IMHO it could be
1. some kind of pseudo random number (drawn from an internal µC counter)
and used as a packet number. In this case the answer of the inverter
should include somewhere the same number.
or
2. some kind of authentication, e.g. a ciphered time value using a
shared secret between the DTU and the inverter.
just an idea... ;-)
or
3. Yet another CRC/"checksum"? (It changes whenever the content
changes.) In that case: how is it calculated? Since it doesn't change
when the source address gets swapped out by the µC, if it is some kind
of checksum, it is likely only influenced by the bytes following the
address information.
Have we ever seen a reply from the inverter in response to a 0x80
message? That might give us some more clues.
Success! Thanks, @docbmuc and @martin (Gast)!
I cycled through some predefined CRC functions. Turns out our mystery
bytes are the same type of CRC as used by the "Modbus" protocol, see
picture. Works for all the examples in "martin" (Gast)'s
SerialData_RFSniff.xlsx, and for the one I originally documented in
hoymiles-datenformat-r3.txt.
New revision of said document attached.
Hallo Martin,
das heisst Du hast es jetzt geknackt? :-)
Bin gespannt, hier wartet auch nich ein HM-1200
DTu werde ich mir keine kaufen - eher kommt der ganze Hoymiles-Schrott
weg...
Amazing!
Based on @petersilie info I adjusted the test program. I cannot test it
at the moment (lack of sun) but the crc calculation should work as
expected.
Maybe it helps someone. (used libraries are also documented in the
platformio.ini file)
I tested the source with an ESP32
Hallo Thomas
das setzen des CRC16-Polynom in Zeile 66 kann aber nicht ganz stimmen,
das sind mehr als 16 bit. Und wenn ich nur 0x8005 und bei online-CRC16M
Rechnern eingebe kriege ich nicht das gewünschte Ergebnis. Vllt bin ich
auch etwas irritiert.
Ich bin ganz g... auf deine Klarstellung und dann werde ich morgen
wieder meinen ProMini bruzzeln bis er durchbrennt oder endlich eine
Antwort kommt.
Ich lese hier schon ein paar Tage mit und ich muss sagen das ist absolut
Spitze wie sich das hier entwickelt. Auf meinem Vordach sonnt sich ein
HM-600 und wartet darauf seine Daten preiszugeben. Ein NRF24-Modul ist
im Zulauf, also bin ich hier auch bald bereit zum Mitspielen 😉
Mit freundlichen Grüßen
Matthias
Hallo Martin,
perfekt - damit wissen wir jetzt das komplette Anfrage-Paket.
Ich habe auch nochmal ein paar Datenpakete überprüft, es passt auch für
das Paket ausgehend von der DTU mit 0x11 anstatt 0x0B im ersten Byte
(nach den Adressen). In den Antworten vom WR habe ich die Modbus-CRC
bisher aber nicht entdecken können.
Für diejenigen, die ihre CRC-Berechnungsfunktion oder weitere Pakete
prüfen wollen, siehe Einstellungen für HxD im Screenshot.
Thomas B. schrieb:> Maybe it helps someone. (used libraries are also documented in the> platformio.ini file)> I tested the source with an ESP32
@Thomas, ich habe den Code getestet, erhielt aber keine Antwort vom
Wechselrichter. Allerdings ist in deinem Code ACK auf Off und Kanal 11
eingestellt - ein Wechsel auf Kanal 3 brachte aber auch keinen Erfolg.
War gestern Abend aber auch nicht sicher, ob die Speisung mit Netzteil
funktioniert hat - zumindest hatte der WR mal grün geblinkt...
Matthias B. schrieb:> Ich lese hier schon ein paar Tage mit und ich muss sagen das ist absolut> Spitze wie sich das hier entwickelt.
@Matthias, ja ich bin auch begeistert, wie das hier Fahrt aufgenommen
hat ;-)
Habe mit meinem Testprogramm (mit CRC16) bisher auch keinen Erfolg, es
kommt einfach keine Antwort.
Ich vermute, da fehlt die richtige Initialsequenz.
Ein Mitschnitt der Kommunikation vom Einschalten der DTU an wäre
bestimmt sehr hilfreich.
Ich habe mir jetzt auch mal diese Logitech Dongles von Arnold geholt.
Ich bin mir irgendwie nicht sicher, was die NRF library raus sendet. Ich
hab das Gefühl, die fügt noch was hinzu. Ich teste dann mal mit meinem
ESP - weil ich denk, der WR müsste so langsam mal antworten, weil die
einzelnen Calls sind ja "entschlüsselt". Kann mir fast gar nicht
vorstellen, das es eine genaue Schrittfolge geben soll.
Marcel
Marcel schrieb:> [...]> Ich teste dann mal mit meinem> ESP - weil ich denk, der WR müsste so langsam mal antworten, weil die> einzelnen Calls sind ja "entschlüsselt". Kann mir fast gar nicht> vorstellen, das es eine genaue Schrittfolge geben soll.
Dass es eine genau einzuhaltende Reihenfolge geben soll, scheint mir
auch unwahrscheinlich. Ich denke aber, der WR wird (für längere
Zeit/nur) auf einem der verfügbaren Kanäle zuhören. Und vielleicht nur
jede Stunde oder so den Kanal wechseln, wenn er in der Zeit nichts
sinnvolles empfangen hat.
Die DTU, bzw. unsere Version davon, muss also zuerst mal auf allen
Kanälen ein "PING" schicken, um zu sehen, ob der WR vielleicht zufällig
gerade auf diesem Kanal zuhört. Erst dann sind weitere Anfragen
überhaupt sinnvoll. Die DTU scheint das nach den Logs hier im Thread ja
auch so in der Art zu machen.
Ich meine, im Datenblatt zum NRF24 gelesen zu haben, dass ein
"0-Payload"-Paket wie ein "PING" funktioniert, d.h. die Gegenstelle wird
brav mit "ACK" antworten. Vielleicht könnten wir als ersten Schritt
probieren, solch einen "PING" auf die jeweils bekannte(n)
Seriennummer(n) auf allen Kanälen zu programmieren?
Danach stellt sich die Frage, welche Anfrage wir dann schicken sollten.
Die mit der Uhrzeit ist eventuell nicht die hilfreichste - welche
Antwort erwarten wir denn darauf?
Wie wäre es mit der "Nachricht 0x81: DTU an WR: "Anfrage DC-Daten""? Da
würde ich dann die DC-Daten als Antwort erwarten.
Einfach anfangen klingt sinnvoll :)
Ich habe auch gesehen es gibt einen Dynamic Payload Length Modus. Im
Excel von martin haben wir ja verschieden lange Pakete.
Das Payload control field in [1] war 0x0d8 = 11011000
Laut Kapitel 7.3.3.1 in [2] ist wird die Payload Length (6 bit lang,
siehe Kapitel 7.3.3) nur verwendet wenn die Dynamic Payload Length
function aktiv ist.
Vielleicht ist das auch noch ein Punkt der zum Erfolg fehlt...
Hätte an meinem Code das hier geändert:
Hallo,
was ich bisher in dem einen Sourcecode vermisse ist, das alle 5
Frequenzen abgeklappert werden.
"Channel List 2403, 2423, 2440, 2461, 2475MHz"
Nur einen Channel zu testen bringt doch nix bzw. wäre Zufall, das der WR
genau da horcht.
Ich kenne mich mit "C" leider nicht so aus. Ich vermisse da jedenfalls
eine Schleife die alle 5 Frequenzen abcheckt.
@Petersilie: Vielleicht mal die Frequenzen in r6 mit aufnehmen :-)
Viele Grüße an Alle, die hier mitarbeiten.
Herbert K. schrieb:> was ich bisher in dem einen Sourcecode vermisse ist, das alle 5> Frequenzen abgeklappert werden.
Siehe Anhang... hatte das bei mir schonmal implementiert aber aktuell
hats keine Sonne :-(
Nur zur Info:
bei irgendwelchen neuen Erkenntnissen über die Kommunikation klappere
ich mit meinem Testprogramm alle bekannten Kanäle ab. Bin mal gespannt
wie oft ich noch bruzzeln kann, bis der uC die Krätsche macht.
Hallo,
Marcel schrieb:> int channels[5] = {3, 23, 40, 61, 75};> 35
mit diesen Kanälen hatte ich damals immer getestet und habe diese dann
irgendwann mal auf
int channels[9] = {1, 3, 6, 9, 11, 23, 40, 61, 75};
angepasst. Alle Informationen, die hier im Forum herausgefunden wurden,
habe ich in meinem Script angepasst und immer auf diesen Kanälen
getestet.
Leider bisher noch kein Erfolg in Form von einem ACK oder sogar
Statistiken vom WR.
Marcel
Marcel schrieb:> Alle Informationen, die hier im Forum herausgefunden wurden,> habe ich in meinem Script angepasst und immer auf diesen Kanälen> getestet.
Hast du die dynamicPayload auch schon getestet oder erst alle Dinge die
vor heute Abend hier standen? Ich halte das aktuell für
vielversprechend.
@martin (Gast),
hattest du schonmal versucht mit einem NRF24 den WR zu pollen? Falls die
DTU im initialen Setup $Dinge im WR einstellt damit dieser antwortet,
müsste das ja bei dir passiert sein und er sollte dann auch einem
"eigenen" NRF24 antworten?
martin schrieb:> @Thomas, ich habe den Code getestet, erhielt aber keine Antwort vom> Wechselrichter. Allerdings ist in deinem Code ACK auf Off und Kanal 11> eingestellt - ein Wechsel auf Kanal 3 brachte aber auch keinen Erfolg.
Hallo Thomas. Ja, ich hatte es getestet - leider ohne Erfolg. Ich
arbeite parallel auch gerade an einem Testsetup mit Arduino Nano und
NRF24 - sobald es etwas neues gibt, melde ich mich.
martin schrieb:> Ich arbeite parallel auch gerade an einem Testsetup mit Arduino Nano und> NRF24
Also meine bisherigen Versuche mit eurer als auch eigener Software sind
fehlgeschlagen - obwohl 2 NRFs miteinander Pingpong spielen (Funkmodul
tut also). Aber was ich sagen kann, der Inverter lässt sich mit einem
24V Netzteil (nominal 2,5 A/60W) speisen und funktioniert dann auch. Das
ermöglicht mir zumindest auch mal Abends zu testen.
Pascal A. schrieb:> hast du noch mehr Daten zu deinem Wechselrichter?> Vielleicht sind es Daten zu Einstellungen, Firmware, ..
@Pascal, hier noch die Daten, die ich dir schuldig geblieben bin ->
Siehe Screenshot.
kann es vielleicht sein, daß die eigenen NRF24L01 1 Mbps statt 256kbps
nutzen. Meiner jedenfalls will trotz Programmierung nach den
SDR-Aufnahmen keine 256kB senden. Liegt aber evtl auch an mir ?
Herbert K. schrieb:> NRF24L01 = 1 MHz u 2 MHz> NRF24L01+ = 256 K u. 1 u 2 MHz
daran liegts dann bei mir bzw. meinen Modulen. Ich werd mir 24LE01
bestellen, wie sie verwendet werden.
Hallo,
ich habe mir mal zwei NRFs aufgebaut und der eine sendet die Daten so,
wie der WR sie eigentlich empfangen soll und wie es hier im Forum
gepostet wurde.
Den zweiten NRF habe ich mit einer Scanner logig beschrieben
(https://github.com/insecurityofthings/uC_mousejack/blob/master/src/main.cpp#L183).
Dieser Scanner findet auch ein paar valide Nachrichten in meinem Umfeld
- aber leider nicht die, die ich mit dem anderen NRF sende.
Dazu habe ich im Scanner mal nur den channel = 3 (und im while loop das
channel++ auskommentiert) eingestellt und der 2. NRF sendet auch aller
140ms auf diesem Kanal.
Sind wir denn sicher, das die CRC Berechnung korrekt ist (ich bin leider
kein Experte in Bit Operatoren und Bit Verschiebung).
Zeile, die prüft ob die CRC die empfangen wurde auch einer Berechnung
stand hält befindet sich hier:
https://github.com/insecurityofthings/uC_mousejack/blob/master/src/main.cpp#L183
Marcel
Ein anderer Ansatz: man könnte versuchen, die Firmware aus dem nRF24LE1
auszulesen. Die SPI-Schnittstelle dafür ist auf der DTU-Platine
beschriftet. Sollte das Flash nicht lesegeschützt sein, könnte man sich
die Initialisierung/Kommunikation mit dem RF-Kram via Disassembler
ansehen.
Zum Auslesen gibt es verschiedene Möglichkeiten:
FTDI FT232R:
https://github.com/jdelfes/nrf24le1_flasher
Mein Wechselrichter ist angekommen!
Leider bisher ohne DTU ("Lieferschwierigkeiten" - große Hoffnungen habe
ich nicht).
Mein Testsetup besteht aus 2 RaspberryPis mit jeweils einem NRF24L01+
Modul.
Auf einem Pi läuft der "pretender", der sich wie ein WR verhalten soll.
Auf dem anderen Pi läuft der "discoverer", der nacheinander eine
Testnachricht an alle einprogrammierten Seriennummern auf allen Kanälen
sendet, und jeweils anzeigt, falls er ein ACK zurückbekommt.
Der "discoverer" findet auch brav den "pretender", auch wenn ich diesen
zwischendurch auf einen anderen Kanal wechsle.
ABER mein Wechselrichter antwortet nicht.
Das führt mich zu folgender Schlussfolgerung:
Der Auto-ACK-Modus ist Wechselrichter-seitig vermutlich doch nicht
aktiv.
Hat jemand auf der Funkschnittstelle schon mal wirkliche ACK Pakete
gesehen? Das "nACK" Bit im "PCF" sagt ja nur, ob der RF-Transceiver das
Paket bestätigen soll, sofern Auto-Ack eingeschaltet ist. Wenn das
nicht der Fall ist, wird er auch keine Bestätigung senden, egal welchen
Zustand das nACK Bit hat.
Ich habe mal ein Github-Repo für die Hoymiles-Kommunikation angefangen.
Vielleicht können wir das gemeinsam erweitern?
Mein Quellcode liegt hier: https://github.com/grindylow/ahoy
Ein zielführender nächster Schritt wäre, zu versuchen, einen 'pretender'
als weiteren Wechselrichter an eine DTU anzulernen.
Dann sollten wir sehen, welche Pakete die DTU an die entsprechende
Seriennummer schickt, und können von dort Stück für Stück die weitere
Kommunikation beobachten. Hat jemand die Möglichkeit, das
auszuprobieren?
@arnaldo_g, do you think you might be able to program your receiver to
respond to the same address as one of your inverters? That way it should
receive the queries from the DTU directly, without us having to guess
what the sniffer tool may or may not be doing to the received packets.
Also, at night, the inverters will stop replying, but traffic to the
'pretend' receiver should continue.
Hallo zusammen,
ich habe hier nochmal ein paar Captures zusammengestellt, vielleicht
hilft es dem Projekt ja weiter, wenn da noch jemand anderes draufschaut.
Es sind .sal (Saleae Logic) Captures der seriellen Schnittstelle in der
DTU.
Und .pcapng (Wireshark captures) mit dem yveaux NRF24 sniffer, jeweils
auf den bekannten Adressen. Interessanterweise antwortete der Inverter
nur auf einem Kanal von den 3 betrachteten.
Ich kann auch noch die dazugehörigen RF-Scans vom HackRF zur Verfügung
stellen, diese können im Universal Radio Hacker geöffnet werden. Sind
aber mehrere Hundert MB groß, deshalb nur auf Anfrage.
Ich vermute, dass die DTU alle Kanäle durchtestet und wenn der Inverter
antwortet, diesen Kanal dann weiterhin verwendet. Kann das aber im
Moment leider nicht verifizieren, da der Java Spectrum Analyzer seit dem
Firmwareupdate des HackRF nicht mehr tut...
Schönen Sonntag noch.
Hallo in die Runde,
ich möchte eure interessante „Forschung“ nicht stören, habe aber
vielleicht einen hilfreichen Hinweis:
Bei den Letrika-WR mit wireless M-Bus war das so, dass man diese
zuallererst bei der Basis registrieren musste, bevor eine Kommunikation
möglich war. Anschließend sprach der WR nur noch mit dieser DTU. Wenn
man eine andere DTU verwenden wollte, musste man den WR zuerst
de-registrieren und dann neu registrieren. Die Registrierung erfolgte
mit der Master-ID, der Seriennummer der DTU.
Bei der Hoymiles-DTU könnte das eventuell im Installationsschritt „H“
erfolgen.
martin schrieb:> Ich kann auch noch die dazugehörigen RF-Scans vom HackRF zur Verfügung> stellen, diese können im Universal Radio Hacker geöffnet werden. Sind> aber mehrere Hundert MB groß, deshalb nur auf Anfrage.
Hallo Martin,
solche RF-Aufnahmen, z.b. als IQ-File, wären sicher am besten. Da würden
ganz kurze Ausschnitte davon mit den Sendungen ja voll ausreichen. Die
könnte man dann selbst demodulieren, falls nötig.
Als Anhang eine demodulierte Sendung von meinen Versuchen. Ich hab da
momentan kein 16-bit CRC dran. Ist dieser immer vorhanden beim Senden ?
( da die demodulierte Sendung nicht mittig liegt, hab ich eine relativ
große Frequenzabweichung. Da muß ich den Quarz am NRF noch besser
abgleichen)
Gruß
golf
Hallo zusammen.
Ich habe auch zwei Hoymiles Modulwechselrichter und eine DTU Lite.
Ich habe mir nun, inspiriert durch die bisherigen Inhalte, zwei
NRF24L01+ Module besorgt und diese mit einem Arduino nano gekoppelt. Ein
Modul bekommt als Adresse die Adresse der DTU, das andere die Adresse
eines der Wechselrichter. Damit schneide ich den Datenverkehr zwischen
DTU und Wechselrichter mit. Ich nutze dazu den yveaux NRF24 sniffer in
abgewandelter Form. Zunächst ist dabei nur ein Daten Durcheinander
herausgekommen.
Wenn man allerdings den gelesenen Nutzdaten Stream jeweils um ein Bit
nach links verschiebt, sieht das Ganze ein wenig besser aus.
Meine DTU hat die Adresse 0x50908172.
Die Wechselrichter haben diese Adressen: WR1 0x19461073. WR2 0x39441073.
Am Beispiel eines empfangenen Rohdatenstreams wird aus:
Ab Byte 3 wird darin zweimal hintereinander die Adresse eines der
Wechselrichter gesendet. Allerdings wird die Wertigkeit gedreht, aus
0x19461073 wird 73-10-46-19.
Wende ich dies auf die empfangenen Streams an und formatiere es ein
wenig, so tauchen an den Stellen im Stream nur die bekannten Bytefolgen
der Adressen auf, allerdings in umgekehrter Reihenfolge. Siehe Anhang.
Kann jemand dies anhand seiner aufgezeichneten Streams mit seinen
Seriennummern bestätigen?
Super! Tolle Mitschnitte und Erkenntnisse!
Das mit dem Verschieben um 1 Bit macht Sinn, da das "Enhanced
Shockburst"-Protokoll seinen Vorgänger, das "Shockburst"-Protokoll, um
ein 9-bit "Packet Control Field" erweitert. Alles nach diesem "PCF"
erscheint dann um ein Bit verschoben.
So wie ich das verstehe, arbeitet der "Sniffer" im "normalen" Shockburst
Modus, wo man dem Chip wohl beibringen kann, auch Pakete durchzuleiten,
die nicht CRC-geprüft sind. Eventuell gehen allerdings dafür die letzten
Bytes verloren, das würde erklären, wenn Dir am Ende die
protokoll-eigene CRC fehlt. Shockburst ist wohl auf 30 Bytes beschränkt,
und da gehen die 5 Adressbytes noch weg, also können 27 Byte lange
Nachrichten inkl. CRC evtl. nicht mehr ganz gelesen werden. Das ist aber
kein Problem, denn wenn wir so weit sind, können wir die Nachrichten ja
auch im echten "Enhanced Shockburst" Modus mitlesen.
Zu Deiner Nachricht: Das passt super. Mit den verschobenen Bits ergibt
sich nämlich direkt die Nachricht [0x01: WR an DTU: "Aktuelle DC
Daten"], siehe hoymiles-datenformat-r5.txt.
1
02-D8-95-*73-10-46-19-73-10-46-19*- [01-00-01-]
2
01-58- 01-5C- 04-AA-
3
01-56- 01-55- 04-8C- 00-00- B4- 2E xx
Dein WR Seriennummer xxxx73104619 sieht
* Auf Kanal 1: 34.4 V; 3.48 A; 119.4 W
* Auf Kanal 2: 34.2 V; 3.41 A; 116.4 W
Die Bedeutung der anfänglichen [01-00-01] kennen wir noch nicht genau.
Die erste 01 ist vermutlich ein Befehlscode.
Oliver F. schrieb:> Kann jemand dies anhand seiner aufgezeichneten Streams mit seinen> Seriennummern bestätigen?
Hallo Oliver,
ja, das sieht vertraut aus. Ich erkenne darin die bereits analysierte
Paketstruktur wieder.
Man sieht die Anfrage von der DTU mit der Kennung 0x15, danach das
übliche 0x80 0x0B, die Unix-Zeit 0x62...
Die Antwort vom Inverter beginnt mit 0x95 und enthält die Daten wie
Martin G. oben schon aufgeschlüsselt hat.
Was mir hier und auch in meinen Daten aufgefallen ist: In den
Anfrage-Daten der DTU taucht in der ganzen Reihe mit den Nullen immer
mal wieder eine Zahl auf - Könnte diese etwas mit dem Funkkanal zu tun
haben, der für die Antwort verwendet werden soll?
Der Spectrum Analzer zeigt, wie die Kanäle abwechselnd genutzt werden,
wenn die DTU nach dem Inverter "sucht". Demnächst werde ich noch
aufzeichnen was passiert, wenn der Inverter dann antwortet.
Anbei noch wie von golf angemerkt eine kurze Sequenz auf Kanal 40 als IQ
File zur Analyse mit dem Radio Hacker.
vielen Dank Martin für deine Aufnahmen.
Es reicht eigentlich eine Realwandlung des IQ-Files, um die Bits
abzulesen. Auch der Momentanfrequenzverlauf ist sehr sauber.
B. G. schrieb:> Auch der Momentanfrequenzverlauf ist sehr sauber.
Hallo golf,
mit welchem Programm hast du die Auswertung auf dem zweiten Bild
gemacht?
Die Bits sieht man hier viel deutlicher, als bei der Auswertung mit dem
Universal Radio Hacker (URH).
Durch die Verschiebung der Daten um 1 Bit wegen des 9-Bit Packet Control
Fields ist auch die Hex-Ausgabe im URH nicht wirklich hilfreich.
Ich hatte mir deshalb mit folgendem Excel-Template beholfen - ist
natürlich Quick & Dirty, da die Bits nicht immer 100% passen, aber mir
hat es definitv weitergeholfen, den Signalaufbau besser zu verstehen.
martin schrieb:> mit welchem Programm hast du die Auswertung auf dem zweiten Bild> gemacht?
Hallo Martin,
das ist alles von mir mal in Delphi selbst geschrieben im Programm für
meinen
Eigenbau-SDR. Ich hab auch einen Modulator gebaut, damit hab ich deine
Aufnahme einfach wieder mit dem SDR empfangen können.
Leider bringen Dir die Programme nichts ohne die Hardware dazu.
Ich hab die Aufnahme erst auf 16 bit gebracht und als Wave gespeichert,
da mein SDR nur 16 bits verarbeitet.
Das Programm für die Complex to Realwandlung könnte ich evtl versuchen
anzupassen an die 8-bits vom HackRF. Das kann auch wahlweise
demodulieren.
emhopa schrieb:> Hallo in die Runde,>> ich möchte eure interessante „Forschung“ nicht stören, habe aber> vielleicht einen hilfreichen Hinweis:> Bei den Letrika-WR mit wireless M-Bus war das so, dass man diese> zuallererst bei der Basis registrieren musste, bevor eine Kommunikation> möglich war. Anschließend sprach der WR nur noch mit dieser DTU. Wenn> man eine andere DTU verwenden wollte, musste man den WR zuerst> de-registrieren und dann neu registrieren. Die Registrierung erfolgte> mit der Master-ID, der Seriennummer der DTU.>> Bei der Hoymiles-DTU könnte das eventuell im Installationsschritt „H“> erfolgen.
So etwas dachte ich Anfangs auch. Ich mag mich täuschen, aber es sollte
doch zumindest bei @martin (Gast) funktionieren, da bei ihm ja die
Seriennummer der DTU schon im WR registriert sein müsste.
B. G. schrieb:> Das Programm für die Complex to Realwandlung könnte ich evtl versuchen> anzupassen an die 8-bits vom HackRF. Das kann auch wahlweise> demodulieren.
Ich hab mal eine 1.Version meines Complex2Real Wandlers mit opt.
Demodulation versucht, die auch die HackRF Files bearbeiten kann
(.complex16s). Ich selbst habe keinen HackRF, nur meine Eigenbauten.
Leider machen die aktuellen Delphi-Compiler auch aus einem kleinen
Programm gleich Megabytes.
Vielleicht ist das ja für jemand nützlich. Das Jpg mit der demodulierten
Bitfolge entstand aus der Datei 'HackRF_session2_2440MHz.zip' von
martin.
Die Ausgabe des Programms ist immer ein Wavefile.
B. G. schrieb:> Vielleicht ist das ja für jemand nützlich. Das Jpg mit der demodulierten> Bitfolge entstand aus der Datei 'HackRF_session2_2440MHz.zip' von> martin.
Vielen Dank, habe es gleich mal getestet. Die Signale lassen sich damit
deutlicher ablesen als mit dem URH - hier mal ein Vergleich in meiner
Analyse-Excel.
gut daß es soweit funktioniert.
bei den bei mir vorliegenden Hf-Aufnahmen sind nur Blöcke vom Inverter.
sendet der DTU denn auf einer anderen Frequenz ?
gibts HF-Aufnahmen oder demodulierte Sendungen vom NRF24 des DTU, die
wären interessant ?
Hallo golf,
anbei ein Mitschnitt auf Kanal 23, wo beide Teilnehmer beteiligt waren.
Die zugehörigen seriellen Pakete und Wireshark Captures hatte ich
bereits oben angehängt jeweils unter "Session 1".
Wer wann auf welcher Frequenz sendet scheint momentan noch eines der
größten Rätsel zu sein. Bei meinem Test am Sonntag spielte sich das
meiste offenbar auf Kanal 40 ab.
emhopa schrieb:> Wenn> man eine andere DTU verwenden wollte, musste man den WR zuerst> de-registrieren und dann neu registrieren. Die Registrierung erfolgte> mit der Master-ID, der Seriennummer der DTU.
Ja, das kann schon sein - aber bei mir sind die beiden Teilnehmer
bereits registriert. Also sollte doch theoretisch irgendwas durchkommen?
martin schrieb:> B. G. schrieb:>> Vielleicht ist das ja für jemand nützlich. Das Jpg mit der demodulierten>> Bitfolge entstand aus der Datei 'HackRF_session2_2440MHz.zip' von>> martin.>> Vielen Dank, habe es gleich mal getestet. Die Signale lassen sich damit> deutlicher ablesen als mit dem URH - hier mal ein Vergleich in meiner> Analyse-Excel.
Was mir hier auffällt ist, dass Addr[0] Null ist. Bei den vorherigen
Auswertungen war das doch immer 0x01?
martin schrieb:> anbei ein Mitschnitt auf Kanal 23, wo beide Teilnehmer beteiligt waren.
was mir aufgefallen ist. Da ist im Frequenzbereich noch ein 2 Inverter
aktiv. Wenn ich die Samplerate mit 20 Mhz richtig interpretiert habe,
dann sendet der 3 Mhz tiefer. Jpg ist Teil der auf Real gewandelten
Aufnahme.
sowas wie Start, $32,88,81,72,01, 011011000,
$95,72,22,02,00,72,22,02,00,
$01,00,01,00,E4,01,64,03,2D,00,02,00,02,00,00,00,00,3A,33,41..
wenn ich mich nicht verschaut hab.
Ist es so, daß die NRFs immer diese Wiederholungen machen, wie es sich
darstellt, oder sieht das nur so aus wegen dem Schnitt der Aufnahmen ?
B. G. schrieb:> Ist es so, daß die NRFs immer diese Wiederholungen machen, wie es sich> darstellt, oder sieht das nur so aus wegen dem Schnitt der Aufnahmen ?
Also die Pakete werden tatsächlich ein paar mal im Block so gesendet.
Das ist vermutlich das automatische Retry, die Pause zwischen den
Paketen beträgt ca. 1 ms.
3 MHz tiefer wäre dann Kanal 20? Ist das tatsächlich ein Signal oder
kann das ein Fehler von meiner SDR-Messung sein?
Das wäre natürlich ein wichtiger Hinweis, wenn der Inverter gar nicht
auf den gleichen Kanälen antwortet wie die DTU...
martin schrieb:> kann das ein Fehler von meiner SDR-Messung sein?
da der 2. NRF-Sender gleichzeitig (etwas verzögerter Start) mit auf der
Aufnahme ist muß das so stimmen, auch die Frequenzen. Vorausgesetzt daß
meine Annahme der Samplerate mit 20 Mhz stimmt.
(gewandelte Realfiles haben bei meinem Programm dann immer doppelte
Samplerate, da aus dem IQ-Stereo File ein Monofile wird).
Aber ich hab das wohl falsch beschrieben. Es dürfte wohl so sein, daß
auf der Spektrummitte (2423 MHZ) der DTU sendet und hier dann 3 Mhz
tiefer (2420 Mhz) der Inverter antwortet.
Das Verhalten läßt sich bestimmt mit neuen Aufnahmen prüfen. Ob die
Abweichnung der beiden Sendefrequenzen immer gleich bleibt, muß man
sehen.
(Ich weiss allerdings nicht, ob der HackRF irgendwas gemischt hat in
diesen Bereich, da ich den nicht kenne, glaub das aber eher nicht).
B. G. schrieb:> Es dürfte wohl so sein, daß> auf der Spektrummitte (2423 MHZ) der DTU sendet und hier dann 3 Mhz> tiefer (2420 Mhz) der Inverter antwortet.
Im Universal Radio Hacker (UHR) sieht es für mich so aus, als ob auf der
Spektrummitte zwei Sender unterwegs wären. Einer mit stärkerem Signal
(DTU, weil näher am HackRF?) und ein schwächerer (Inverter?).
Hallo Daniel,
das stimmt schon. Ich weiss halt nur nicht, ob das alles
Aufnahmeschnipsel sind von mehreren Aufnahmen oder ob das alles am Stück
auf der 2423 Mhz so statt gefunden hat.
Das sind ja immmer nur kleine Teilstücke.
Das kann nur Martin beantworten.
Da wäre evtl so ein Bild eines Sonogramms einer Aufnahme aussgefähiger
ohne ausgeschnittene Stellen.
Da wäre z.b. ein Sonagrammbild des ganzen Ablaufs ( der Aufnahme ) evtl
aussagefähiger ohne die Aussetzer.
Oder nimmt der HackRF squelchgesteuert auf oder sowas ?
Ich lass bei mir immer die Aufnahmen durchlaufen (geht theoretisch bis
die platte voll ist) ohne Sampleverluste. Hab hier nur keine
DTU-Signale.
Nachtrag: doppelt gesendet, das ist was schief gelaufen bei mir
@martin (Gast) - könntest Du vielleicht die großen Originalcaptures bei
einem Filesharing-Dienst hochladen?
Wetransfer kann zum Beispiel kostenlos bis 2 GB.
https://filetransfer.io/ wohl bis zu 6 GB.
Hallo Martin, golf und Daniel,
leider war mein Studienschwerpunkt Automatisierungstechnik, deshalb bin
ich bei den HF-Themen nicht ganz so fit - was heißt Squelch? ;-)
Anbei die 3 Mitschnitte bei 3, 23 und 40 MHz als komplette Files
(zeitgleich aufgenommen wie die Logic und Wireshark Captures).
https://filetransfer.io/data-package/1Z2bKt05#link
Samplerate und Bandbreite je 20M (samples/s bzw. Hz).
In der RF-Aufnahme ist viel Mist dazwischen, weil Inverter und DTU ja
offensichtlich immer zwischen den Kanälen hin und her wechseln und halt
unvermeidlich WLAN oder sonst was in der Gegend rumfunkt.
Kann das "Doppelbild" daher kommen, dass ich gleichzeitig zwei
Arduino/NRF24 Sniffer mitlaufen habe lassen? Theoretisch müssten diese
doch rein passiv zuhören, oder?
Hier zum besseren Verständnis noch ein Bild, wie bzw. was ich gemessen
hatte mit allen Teilnehmern.
3 Versuche auf den jeweiligen Frequenzen (2403, 2423 und 2440 MHz).
hallo martin,
squelchgesteuerte Aufnahmen nehmen nur auf, wenn ein bestimmter
Empfangspegel überschritten wird.
Aber bei dem HackRF kann das Verhalten auch durch die 8-bit bedingt
sein, das sind jedenfalls für mich teils recht ungewöhliche Aufnahmen.
Es gibt NRFs mit teils sehr unterschiedlichen Pegeln, dann bricht die
Aufnahme teils abrupt ab. Das sind Aussetzer, weil der PC mit der
Datenrate überfordert ist. Die 40 MB/sec sind halt ziemlich das Maximum
für USB2, was geht.
Evtl zur Sicherheit mal bei weiteren Aufnahmne die Sniffer-NRFs aus
lassen.
Bei kurzer Durchsicht gab es mehrere Stellen mit verschiedenen
Frequenzlagen.
bei der 2403 wurde teilweise fast auf der gleichen Frequenz gesendet.
Dann sieht man scheinbar mehr als 2 Umtastfrequenzen.
Siehe Bilder
bei dem HackRF_1_2423Mhz_1_NRF_auf_ca_2420_Mhz.JPG sind wohl auch 2 NRFs
fast auf der gleichen Frequenz. Scheinbar auch mehr als 2
Umtastfrequenzen. Muß näher untersucht werden
Beim Überfliegen der Aufnahmen mit "inspectrum" (zum Öffnen:
*.complex16s in *.cs8 umbenennen) ist mir angehängter Abschnitt
aufgefallen. Zwei verschiedene Sender? Ein Paket mit Länge 27 und
cmd=0x95 (-> Inverterdaten) und das andere ein 0-Byte-Paket - ist das
ein ACK? Vielleicht vom Sniffer-NRF?
Ich meine auch, daß da diese Sniffer vielleicht mitmischen.
Anbei eine grobe Darstellung der Blöcke auf den Frequenzen mit diversen
Pegeln. Ob die Blöcke von DTU/INV oder teilweise von den Sniffern sind ?
Bei den beschriebenen Blöcken mit mehr als 2 Frequenzen scheint der
Sender irgendwie instabil, sieht eher nicht nach 2 NRFs aus.
Vielleicht sollten wir auf eine neue Aufnahme warten ohne die
Sniffer-NRFs.
Hallo,
leider habe ich keine DTU um mitzumischen.
Warum versteift Ihr Euch so auf den HF Teil ?
Warum geht Ihr nicht direkt an die "digital" PINs für die Kommunikation
zwischen dem GD... und dem nRF ? Einen Logic Analyzer da dran, der
gleich die Kommunikation dort decodiert ?
Mann müsste vielleicht mal alles in den Werkszustand versetzen.
Bevor der DTU überhaupt per USB mit Spannung versorgt wird, schon den LA
loslaufen lassen.
Wer weiss, ob die ganzen Register vom nRF überhaupt schon zu dem passen,
was hier durch obige Programme und LIBs gemacht wird ? Vielleicht ist
es nur 1 Bit in irgendeinem Register, was noch nicht passt ?
Ist nur so eine Überlegung von mir. Ich will niemanden einen Vorwurf
machen (falls sich jemand auf den Schlips getreten fühlt) !
! ! ! Danke an alle, die schon eine DTU haben und Ihr Bestes geben ! !
!
Foto ist von (C)Martin. Nur die Aufmerksamkeit.