DIY väderstations mottagare.
Det hela började med att vi inhandlade en väderstation på Clas Ohlson, en Cotech 36-7959 för att vara mer exakt.
En av funktionerna som jag tyckte verkade kul var att man kunde koppla in displayen via USB till datorn för att ladda ner datan som fanns sparad på den. Men enda sättet som detta gick att göra på var via något konstigt program som inte alls var kul. Tanken var att istället sätta en Raspberry Pi Zero på baksidan för att samla in data från displayen och sedan skicka till programmet WeeWX. Så jag började sniffa USB porten för att försöka lista hur den kommunicerade, men gav upp på det spåret.
Ett tag tänkte jag att jag skulle bygga ihop något med en Raspberry Pi 3B+ och en RTL-SDR dongel då jag tidigare hade testat och sett att det var möjligt att läsa av meddelanden med programmet rtl_433, men tyckte det var en lite tråkig lösning och av en slump så kom jag in på ett projekt där någon använde sig utav en liten transceiver vid namn RFM69 från HopeRF, för att avkoda meddelanden från en IKEA Sparsnäs elmätare/övervakare. Lät som ett kul projekt då även jag hade en sån elmätare från IKEA. Dessa små moduler var inte speciellt dyra och fanns dessutom för olika frekvenser, har minne av att jag även hittade någon som skrev att man eventuellt kunde använda dessa för att läsa av just väderstationer som sände på 433MHz. Så tanken blev att skapa en egen RPi Shield som kunde hantera båda dessa frekvens band, en 433MHz modul för väderstationen och en på 868MHz för IKEA Sparsnäs, men det kom även in en RTC med backup batteri och en Zigbee modul i designen.
Gjorde en design i KiCad som jag sen skickade efter att få tillverkad, vilket kom tillbaka med riktigt bra resultat.
Men kanske blir till att beställa en ny version då jag hade gjort några misstag.
Komponenter monterade på kortet
Kort monterad på Raspberry Pi i låda
Typ färdigt
Men hur skulle man kunna ställa in RFM69 för att kunna läsa meddelanden från väderstationen?
Då jag visste sen tidigare att rtl_433 kunde på något sätt avkoda signalen tillsammans med en rtl-sdr dongel, så började jag titta där, närmare bestämt i cotech_36_7959.c.
Filen gav mig mycket information om hur signalen var kodad, i detta fallet var det så kallad "On-Off-Keying" eller OOK, dvs den slår på och av vid en viss frekvens för att kunna skicka en "1" respektive "0". På detta användes dessutom Manchester kodning, vilket medför att biten kodas emellan 2-bitar, "01" -> "stigande" = "1", "10" -> "fallande" = "0". Men kan även vara tvärtom som denna modulen kodar/avkodar på, vilket även denna väderstation verkade skicka ut på :).
Då modulen uppfyllde båda dessa saker så tänkte jag att det bara var att ställa in på samma sätt som för rtl_433... Men så enkelt var det inte. Hade läst någonstans att väderstationen skickade ut ett meddelande ungefär var 16:e sekund, men i mitt fall så dök det bara upp skräp data i tid och otid, inte var 16:e sekund.
Synk värdet som rtl_433 verkade använda var 0x0140 vilket inte alls fungerade för mig. Men ibland kunde jag faktiskt få ut något som jag trodde var rätt, då det dök upp ungefär samtidigt som jag såg det riktiga meddelandet dyka upp i SDR# på samma frekvens.
Är inte helt hundra men tänker att detta synk värde (0x0140) som rtl_433 använder är förmodligen redan manchester kodat då programmet kan leta igenom en hel ström av data som är manchester kodad direkt. Men i mitt fall, vilket jag missade under lång tid och som stod i databladet , var att Manchester kodningen endast appliceras på meddelandet när preamble och synk värden är uppfyllda när man kör RFM69 modulen i så kallat "Packet Mode", vilket jag ville göra.
Ett giltigt meddelande från rtl_433 kunde vara detta. (De börjar även alltid med ett hex C)
c6d02c3b8b000084b12dfffbfb
da
meddelande med manchester kodning
checksum CRC-8
Detta gick inte längre då det kändes som om jag bara famlade i mörkret, så att säga. Dags att dra igång Universal Radio Hacker, URH och ta en titt på signalen.
En bit ser ut att vara ungefär 472μs, vilket i detta fallet blir 944 samples/symbol eller 1 bit = 944 samples.
Binära värden ser ju ut att vara 2-byte av preamble följt av en serie som ser ut att vara kodat med manchester, då det aldrig är mer än två "1" eller "0" i följd
Enklare att titta på meddelandet i hex form
aaaa
9996
95a699555669569a65955555555655966a696696aaaaaa6aaa6a65a8
preamble
synk värde
meddelande
Utifrån detta fick jag ut att jag som sagt hade en 2-byte av preamble, men även ett synk värde som jag kunde sätta till 0x9996 då det inte verkade ändra sig hur många meddelanden man än kollade på.
Med dessa värden började det dyka upp lite riktiga meddelanden ifrån modulen, men de stämde inte riktigt, inget hex C när man avkodade manchester.
8da0587716000109625bfff7f7
b4
meddelandet med manchester avkodat
checksum???
Det visade sig att mitt meddelande låg skiftad fel 1-bit åt vänster. Enkelt fixat
46d02c3b8b000084b12dfffb
fb
meddelandet skiftat 1 steg åt höger
checksum
Nästan rätt men den översta byten 0x46 är fel och inte 0xC6 som det borde vara. Detta berodde helt enkelt på att 0x96 som jag använder som en del av synk värdet försvinner från meddelandet, så skulle man manchester avkoda det värdet också så skulle man få 0x96 (1001 0110) -> 0x9 (1001), så LSB är det intressantaste där så på med en 0x01 i början och skiftar hela meddelandet till höger så blir det rätt.
Helt plötsligt gick det att avkoda och verifiera meddelanden från våran väderstation på min Raspberry Pi utan att jag behövde använda en RTL-SDR dongel.
Vad gör man med detta nu då?
Enklaste var ju som jag sett många andra använda är att skicka datan i json format till en MQTT server, som man sen kan försöka få WeeWx att lyssna på. Precis det jag gjort och det fungerar
2022-06-24 20:37:16
CRC-8 calc = 0xe0
OK
ID 109:
SUB_type: 0xc
tBAT_Low: 0
TEMP RAW: 1115
TEMP C: 21.944444444444446
Humidity: 58%
Rain mm: 0.0
Wind dir deg: 133
Light Lux: 131067
UV: 251
CRC: 0xe0
{"dateTime": 1656099436, "model": "Cotech-367959", "id": 109, "battery_ok": true, "outTemp": 21.944, "outHumidity": 58, "rain": 0.0, "windDir": 133, "windSpeed": 2.9, "windGust": 4.3}
Start receiving 433MHz
2022-06-24 20:37:21
CRC-16 calc: 0x85d7
OK
Valid package
Seq 22949:
Time now:
Power: 568.1874229346486 W
Total: 86.645 kWh
Battery: 100%
Power(raw): 3244
{"dateTime": 1656099441, "model": "IKEA Sparsnas", "sequence": 22949, "watt": 568.1874229346486, "total": 86.645, "battery": 100, "rssi": 0, "power": 3244, "pulse": 173290}
Start receiving 868MHz
Jag har tyckt att det har varit ett kul projekt, och nästa steg är väl att bygga något så att jag kan börja ta in blixt data.
Länkar:
WeeWx
RFM69HW.pdf
rtl_433
cotech_36_7959.c
URH - Universal Radio Hacker
SDR#
EspSparsnasGateway