Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- WMR-100 Wetterstation
- =====================
- Not everything is included.
- Some devices/features are missing
- and it's not tested
- """
- import binascii
- import struct
- from collections import namedtuple
- FRAMES = {
- 0x30: "handle_datetime",
- 0x46: "handle_pressure",
- 0x42: "handle_temperature",
- 0x48: "handle_wind",
- }
- Datetime = namedtuple("DateTime", "frame datetime checksum")
- Pressure = namedtuple("Pressure", "frame prediction pressure checksum")
- Temperature = namedtuple("Temperature", "frame sensor_id temperature humidity power_supply checksum")
- Wind = namedtuple("Wind", "frame direction speed_mps speed_mph checksum")
- def handle_datetime(data):
- result = struct.unpack("<b3x5bxb", data)
- frame, minute, hour, day, month, year, checksum = result
- return Datetime(frame, datetime.datetime(2000 + year, month, day, hour, minute), checksum)
- def handle_pressure(data):
- if data[0] != 0x46:
- raise TypeError("Wrong frame")
- frame, prediction, low_pressure, high_pressure_nibble, checksum = struct.unpack("<bx4b", data)
- weather = ["Partly Cloudy", "Rainy", "Cloudy", "Sunny", "Snowy"]
- prediction >>= 4
- try:
- prediction = weather[prediction]
- except IndexError:
- raise TypeError("Unknown prediction")
- high_pressure_nibble &= 0x0f
- pressure = high_pressure_nibble << 8 | low_pressure
- return Pressure(frame, prediction, pressure)
- def handle_temperature(data):
- if data[0] != 0x42:
- raise TypeError("Wrong frame")
- frame, sensor_id, temp, humidity, power_supply, checksum = struct.unpack("<2bh2b3xb", data)
- sensor_id &= 0x0F
- temp /= 10
- psu = {0x50: "no AC", 0x6E: "AC OK"}
- return Temperature(frame, sensor_id, temp, humidity, psu.get(power_supply, "Unkown Power Supply"), checksum)
- def handle_wind(data):
- if data[0] != 0x48:
- raise TypeError("Wrong frame")
- frame, direction, speed, checksum = struct.unpack("<2bxb4xb", data)
- direction &= 0x0F
- directions = "N E S W".split()
- return Wind(frame, directions[direction], speed * 0.1, speed * 0.36, checksum)
- def handle_hexstr(text):
- data = binascii.unhexlify(text.replace(" ",""))
- try:
- func_name = FRAMES[data[0]]
- func = globals()[func_name]
- except KeyError as e:
- raise TypeError("Frame Type is not known") from e
- return func.__name__, func(data)
- def main_loop():
- """
- Testfunktion
- """
- time_stamp = None
- temperature = None
- pressure = None
- wind = None
- while True:
- hex_str = input("Bitte Hex Sting eingeben: ")
- func_name, result = handle_hexstr(hex_str)
- if isinstance(result, Datetime):
- time_stamp = result.datetime
- elif isinstance(result, Temperature):
- temperature = result.temperature
- elif isinstance(result, Pressure):
- pressure = result.pressure
- elif isinstance(result, Wind):
- wind = result.speed_mph
- print(time_stamp, temperature, pressure, wind)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement