RFXCOM uitlezen met RFXcmd

Door ThinkPad op zondag 19 juni 2016 11:54 - Reacties (5)
Categorie: Domotica, Views: 3.595

Inhoudsopgave
Inleiding
RFXcmd (Python-script)
RFXcmd installeren
Het script automatisch laten starten en zorgen dat het blijft draaien
De data vanuit RFXcmd naar een externe applicatie sturen

Inleiding
Ik heb al tijden een pricewatch: Rfxcom RFXtrx433E USB 433.92MHz Transceiver in gebruik. Ik heb hem destijds aangeschaft om met Domoticz te gebruiken om m'n KlikAanKlikUit-ontvangers aan te sturen.
RFXCOM RFXtrx433E

De tijden zijn veranderd en ik gebruik geen Domoticz meer en ook geen KlikAanKlikUit meer. Tegenwoordig draait mijn woning op een pricewatch: Zipato Zipabox Smart Home Controller en zijn de KaKu-modules vervangen voor Z-Wave modules omdat de betrouwbaarheid van 433Mhz toch te wensen overliet.

De RFXCOM is echter al die tijd gebleven. De Zipabox heeft namelijk wel een 433Mhz module (pricewatch: Zipato Zipabox 433MHz module), maar die ondersteunt niet alle devices. Zo heb ik bijv. tweemaal de pricewatch: Cresta Thermo-hygro sensor in huis, die worden door Zipato niet ondersteund. Ook een losse Home Easy wandschakelaar ondersteunen ze niet.

De RFXCOM bleek daarbij erg handig, die ondersteunt zoveel protocollen dat het geen probleem was om de bovengenoemde items te ontvangen. Waar ik echter wel mee zat, is dat ik geen volledig domoticapakket (zoals bijv. Domoticz) 24/7 draaiend wilde hebben enkel en alleen om 3 apparaten te ontvangen 8)7

RFXcmd (Python-script)
Gelukkig blijkt er een Python-script te zijn waarmee je de RFXCOM perfect kunt uitlezen, RFXcmd. Omdat dit script volgens mij niet erg bekend is, heb ik besloten om er een blogpost over te schrijven. Ik heb het draaien in een virtuele machine op mijn thuisserver.
De website is op dit moment uit de lucht, maar met de Wayback Machine valt de site nog wel te bekijken.

RFXcmd installeren
Van de Github pagina download je de nieuwste versie. Dit .zip bestand pak je uit. Vervolgens kun je het script uitvoeren op de volgende manier:
python /home/domotica/rfxcmd_gc/rfxcmd.py -l -v -d /dev/ttyUSB0 (ttyUSB moet je even uitzoeken waar jouw RFXCOM op zit, kan middels dmesg | grep FTDI

Als je het script uitvoert dan komt er eerst een hele lijst voorbij met overzicht van protocollen die enabled/disabled zijn op je RFXCOM. Vervolgens zul je zien, dat als je het script een tijdje laat draaien, er waarschijnlijk wel wat sensoren zullen worden ontvangen, weerstations van je buren bijv :+

Het script automatisch laten starten en zorgen dat het blijft draaien
Goed, dat is leuk, maar nu? Je moet het script nu handmatig starten en als je het SSH-venster wegklikt stopt het script ook met draaien. Dat is niet handig en willen we anders hebben. Gelukkig is er supervisor. Dit is een 'process control system'. Deze start de processen die jij wilt draaien en belangrijker: zorgt dat ze ook blijven draaien. Mocht het script crashen dan zal het door supervisor automatisch weer opnieuw worden gestart. Ideaal!

Installeer supervisor (apt-get install supervisor), zie ook de uitleg hier.

Vervolgens moeten we een config aanmaken voor rfxcmd, zodat supervisor weet wat hij moet doen en op wat voor manier. In /etc/supervisor/conf.d maak je een nieuw bestand, ik heb hem rfxcmd_gc.conf genoemd. In dit bestand zet je het volgende:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
[program:rfxcmd_gc]
command = python /home/domotica/rfxcmd_gc/rfxcmd.py -l -v -d /dev/ttyUSB21
directory = /home/domotica/rfxcmd_gc/
user = domotica
autostart = true
autorestart = true

stdout_logfile = /var/log/rfxcmd/rfxcmd.log
stdout_logfile_maxbytes = 1MB
stdout_logfile_backups = 3
stderr_logfile = /var/log/rfxcmd/rfxcmd.err.log
stderr_logfile_maxbytes = 1MB
stderr_logfile_backups = 3


Je ziet het commando staan (uitleg van de parameters die ik gebruik vind je door het script op je commandline te runnen met de parameter -help), je ziet de directory van het script staan en de user waaronder het script moet runnen. Verder zie je dat hij het script automatisch moet starten en ook automatisch moet herstarten. De regels daaronder zijn voor logging, die schrijft hij weg naar /var/log/rfxcmd/. Alle ontvangen waarden e.d. komen in rfxcmd.log, de fuotmeldingen in rfxcmd.err.log. Voor beide logfiles heb ik ingesteld dat ze niet groter dan 1MB mogen worden en hij max. 3 versies mag bewaren.

Je ziet dat ik 'ttyUSB21' gebruik, deze naam heb ik handmatig ingesteld, door deze tutorial te volgen kun je zorgen dat de RFXCOM altijd dezelfde tty krijgt toegewezen. Het is aan te raden om dit te doen, mocht je de RFXCOM ooit loskoppelen en weer aansluiten, dan kan het gebeuren dat hij een andere tty krijgt toegewezen en het script niet meer werkt.

Als je de config hebt aangemaakt moet je hem inlezen in [mono]supervisor[mono]. Dit doe je met de volgende commando's:
sudo supervisorctl. Je komt nu op de opdrachtprompt van supervisor.
Je voert dan supervisorctl reread uit, hij zal nu het configbestand wat je net hebt aangemaakt vinden. Vervolgens nog een supervisorctl update om de config toe te voegen.

Als het goed is zou hij RFXcmd nu gestart moeten hebben, dit kun je zien door supervisorctl status te typen. Er zou dan 'RUNNING' achter 'rfxcmd_gc' moeten staan.

De data vanuit RFXcmd naar een externe applicatie sturen
Goed, het script draait, maar hoe krijg ik nou de data die de RFXCOM ontvangt in mijn eigen applicatie? Dit werkt via het trigger.xml bestand. Hiermee kun je triggers aanmaken, een actie die RFXcmd moet uitvoeren bij het ontvangen van een signaal wat voldoet aan het kenmerk wat jij hebt opgegeven.

Eerst openen we supervisor weer en stoppen we het script: stop rfxcmd_gc.
Daarna openen we config.xml en zoeken we naar de regel 'trigger_active' en zetten deze op 'yes': <trigger_active>yes</trigger_active>
Ik heb overigens in de config.xml ook nog ingesteld dat hij de logging naar /dev/null moet schrijven, naast de supervisor-logging houdt RFXcmd er blijkbaar ook nog een eigen logging op na :? Door dit uit te zetten voorkomen we dat onze schijf volloopt.
Dit doe je door <logfile>rfxcmd.log</logfile> aan te passen naar <logfile>/dev/null</logfile> (Als je data naar /dev/null schrijft onder Linux dan verdwijnt dit, zie het als een soort zwart gat :p ).

Vervolgens openen we trigger.xml (sudo nano trigger.xml). Dit is het bestand waarin we onze acties gaan instellen. Bewerk dit bestand alleen via een editor op de Linux-machine waarop je het script gaat draaien. RFXcmd is erg gevoelig en ik heb gemerkt dat als je de trigger.xml met bijv. WinSCP aanpast, je de volgende melding krijgt bij het starten van RFXcmd: "Error in trigger.xml file". Heeft waarschijnlijk met de indeling van het bestand te maken. Als je het gewoon met nano of vi o.i.d. bewerkt dan gaat het wel goed. Krijg je toch de foutmelding dan moet je het trigger.xml bestand even verwijderen en weer opnieuw aanmaken.

Je kunt het bestand helemaal leegmaken, de standaardwaarden hebben we niet nodig.
Een voorbeeld van mijn trigger.xml:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<xml>
<trigger>
        <message>0A4629..330F..........</message><!-- Cresta TX320 woonkamer -->
        <action>curl -i -s -XPOST "http://192.168.4.10:8086/write?db=rfxcmd&rp=volatile" --data-binary "cresta,sensor=woonkamer temp=$temperature$,hum=$humidity$,bat=$battery$" > /dev/null</action>
</trigger>
<trigger>
        <message>0B1100..0003AF8403010F70</message><!-- HE842 Wallswitch ON -->
        <action>curl -s -o /dev/null "http://192.168.4.35/milight/bridge.php?cmd=on&group=4"</action>
</trigger>
<trigger>
        <message>0B1100..0003AF8403000070</message><!-- HE842 Wallswitch OFF -->
        <action>curl -s -o /dev/null "http://192.168.4.35/milight/bridge.php?cmd=off&group=4"</action>
</trigger>
</xml>


De <message> is de unieke waarde waar hij naar zoekt, dit is het serienummer van je sensor. De puntjes zijn wildcards, op die plekken staat namelijk de inhoud van het datapakketje, de temperatuur en luchtvochtigheid en een sequence nummer bijv.

Om achter het serienummer van je sensor te komen kun je in /var/log/rfxcmd/rfxcmd.log kijken, of handmatig RFXcmd starten op de commandline en een tijdje laten draaien. Op een gegeven moment zal je zien dat bepaalde waarden in elk bericht terugkomen en er ook posities telkens anders zijn, die posities zet je de puntjes neer.

De <action> is de actie die RFXcmd moet uitvoeren als hij een <message> ontvangt die aan de ingestelde kenmerken voldoet. In mijn geval voert hij een HTTP-query uit (via curl) om de waarden in een InfluxDB-database weg te schrijven zodat ik er met Grafana grafieken van kan maken. Maar je kunt natuurlijk ook zelf een PHP-script maken die het in een MySQL-database o.i.d. stopt. De aan/uit afkomstig van de schakelaar stuur ik naar een zelfgeschreven PHP-script die mijn Milight lampen aanstuurt.

Als je een temperatuur/vochtigheidssensor gebruikt (zoals de Cresta TX320) dan bevat een uitgezonden bericht allerlei informatie. Deze vang ik af door de variabelen in m'n URL te gebruiken, deze variabelen zal RFXcmd invullen met de waarden uit het bericht wat hij heeft ontvangen. Ik gebruik:
$temperature$
$humidity$
$battery$ (bij de Cresta TX320 geeft deze '9' terug bij een goede batterij en '0' (nul) bij een batterij die leeg begint te raken (vanaf 2,6V heb ik gezien, door regelbare voeding terug te schroeven vanaf 3V).

Als je de trigger hebt aangepast sla je hem op en kun je rfxcmd weer starten. Het beste is om het script eerst even met de hand te starten op de commandline, zo kun je zien of alles naar behoren werkt. Als dat zo is kun je het stoppen (CTRL -C) en het door supervisor laten starten: start rfxcmd_gc.
Als het goed is zou je nu na enige tijd de data moeten ontvangen in jouw applicatie!
InfluxDB

Volgende: Zipato Zipabox teardown 02-'16 Zipato Zipabox teardown

Reacties


Door Tweakers user onok, maandag 20 juni 2016 09:00

Ik heb m ook al een tijdje draaien :) Ik ben ook afgestapt van Domoticz (al vrij snel eigenlijk) omdat ik m'n eigen systeem wilde bouwen.
Ik schakel er alleen een paar kaku lampen mee. Ik heb ook een deurbel op 433mhz, maar die werd helaas niet door de rfxcom opgepikt, waardoor ik alsnog zelf aan de knutsel moest :P

[Reactie gewijzigd op maandag 20 juni 2016 09:00]


Door Tweakers user Neomess, maandag 20 juni 2016 10:08

gebruik dit script inderdaad ook al wat jaartjes, sinds ik het op een Linux installatie draai loopt het script eigenlijk nooit meer vast. (op mijn Windows systeem wilde dit nog wel eens gebeuren)

Gebruik het voor een aantal Action schakel modules, en voor de temperatuur sensors. (inderdaad vang ik ook een temperatuur sensor van één van de buren op)

Z-Wave staat inderdaad ook op mijn lijstje, de Action 433MHZ zenders met één richting communicatie zijn nog al eens een probleem waardoor ik meerdere keren een 'aan' signaal moet versturen voordat de lamp aangaat.

Door Tweakers user Pietervs, maandag 20 juni 2016 19:36

Als n00bje vind ik dit wel reuze-interessant :)
Ik heb de RFXCom, gekoppeld aan een Raspberry Pi3 met Domoticz om 3 (jawel) KaKu schakelaars mee aan te sturen. Waarvan 1 buiten onder het afdak. En alles gecontroleerd door Domoticz.
Tot dusver (maandje of 4) geen klachten. Maar dit script klinkt dan wel weer heel leuk :)

Misschien toch ff een projectje van maken, binnenkort!

Dank voor de tip!

Door Tweakers user ThinkPad, maandag 20 juni 2016 19:45

Pietervs schreef op maandag 20 juni 2016 @ 19:36:
Als n00bje vind ik dit wel reuze-interessant :)
Ik heb de RFXCom, gekoppeld aan een Raspberry Pi3 met Domoticz om 3 (jawel) KaKu schakelaars mee aan te sturen. Waarvan 1 buiten onder het afdak. En alles gecontroleerd door Domoticz.
Tot dusver (maandje of 4) geen klachten. Maar dit script klinkt dan wel weer heel leuk :)

Misschien toch ff een projectje van maken, binnenkort!

Dank voor de tip!
Met Domoticz heb je dit niet nodig, Domoticz zorgt voor het uitlezen van sensoren en aansturen van schakelaars.

[Reactie gewijzigd op maandag 20 juni 2016 19:45]


Door Tweakers user Pietervs, dinsdag 21 juni 2016 10:24

ThinkPad schreef op maandag 20 juni 2016 @ 19:45:
[...]


Met Domoticz heb je dit niet nodig, Domoticz zorgt voor het uitlezen van sensoren en aansturen van schakelaars.
Weet ik, en dat bevalt wel goed :)
Maar tegelijkertijd ben ik nieuwsgierig wat er nog meer aan signalen op te vangen valt via de RFXCom :)

Dus vandaar dat ik "even" wil gaan stoeien met dat scriptje om te zien of ik misschien iets meer kan opvangen in/rond huis.

Om te kunnen reageren moet je ingelogd zijn. Via deze link kun je inloggen als je al geregistreerd bent. Indien je nog geen account hebt kun je er hier één aanmaken.