mirror of https://github.com/merbanan/rtl_433.git
80 lines
2.2 KiB
Python
Executable File
80 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
"""Custom data handling example for rtl_433."""
|
|
|
|
# Start rtl_433 (rtl_433 -F syslog::1433), then this script
|
|
|
|
from __future__ import print_function
|
|
|
|
import socket
|
|
import json
|
|
|
|
# You can run rtl_433 and this script on different machines,
|
|
# start rtl_433 with `-F syslog:YOURTARGETIP:1433`, and change
|
|
# to `UDP_IP = "0.0.0.0"` (listen to the whole network) below.
|
|
UDP_IP = "127.0.0.1"
|
|
UDP_PORT = 1433
|
|
|
|
|
|
def parse_syslog(line):
|
|
"""Try to extract the payload from a syslog line."""
|
|
line = line.decode("ascii") # also UTF-8 if BOM
|
|
if line.startswith("<"):
|
|
# fields should be "<PRI>VER", timestamp, hostname, command, pid, mid, sdata, payload
|
|
fields = line.split(None, 7)
|
|
line = fields[-1]
|
|
return line
|
|
|
|
|
|
def rtl_433_listen():
|
|
"""Listen to all messages in a loop forever."""
|
|
# Open a UDP socket
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
# Bind the UDP socket to a listening address
|
|
sock.bind((UDP_IP, UDP_PORT))
|
|
|
|
# Loop forever
|
|
while True:
|
|
# Receive a message
|
|
line, addr = sock.recvfrom(1024)
|
|
|
|
try:
|
|
# Parse the message format
|
|
line = parse_syslog(line)
|
|
# Decode the message as JSON
|
|
data = json.loads(line)
|
|
|
|
#
|
|
# Change for your custom handling below, this is a simple example
|
|
#
|
|
label = data["model"]
|
|
if "channel" in data:
|
|
label += ".CH" + str(data["channel"])
|
|
elif "id" in data:
|
|
label += ".ID" + str(data["id"])
|
|
|
|
# E.g. match `model` and `id` to a descriptive name.
|
|
if data["model"] == "LaCrosse-TX" and data["id"] == 123:
|
|
label = "Living Room"
|
|
|
|
if "battery_ok" in data:
|
|
if data["battery_ok"] == 0:
|
|
print(label + ' Battery empty!')
|
|
|
|
if "temperature_C" in data:
|
|
print(label + ' Temperature ', data["temperature_C"])
|
|
|
|
if "humidity" in data:
|
|
print(label + ' Humidity ', data["humidity"])
|
|
|
|
# Ignore unknown message data and continue
|
|
except KeyError:
|
|
pass
|
|
|
|
except ValueError:
|
|
pass
|
|
|
|
|
|
if __name__ == "__main__":
|
|
rtl_433_listen()
|