Advertisement
DeaD_EyE

WMR-100 Wetterstation beispiel

Nov 1st, 2020
2,809
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.06 KB | None | 0 0
  1. """
  2. WMR-100 Wetterstation
  3. =====================
  4.  
  5. Not everything is included.
  6. Some devices/features are missing
  7. and it's not tested
  8. """
  9.  
  10.  
  11. import binascii
  12. import struct
  13. from collections import namedtuple
  14.  
  15.  
  16. FRAMES = {
  17.     0x30: "handle_datetime",
  18.     0x46: "handle_pressure",
  19.     0x42: "handle_temperature",
  20.     0x48: "handle_wind",
  21. }
  22.  
  23.  
  24. Datetime = namedtuple("DateTime", "frame datetime checksum")
  25. Pressure = namedtuple("Pressure", "frame prediction pressure checksum")
  26. Temperature = namedtuple("Temperature", "frame sensor_id temperature humidity power_supply checksum")
  27. Wind = namedtuple("Wind", "frame direction speed_mps speed_mph checksum")
  28.  
  29.  
  30. def handle_datetime(data):
  31.     result = struct.unpack("<b3x5bxb", data)
  32.     frame, minute, hour, day, month, year, checksum = result
  33.     return Datetime(frame, datetime.datetime(2000 + year, month, day, hour, minute), checksum)
  34.  
  35.  
  36. def handle_pressure(data):
  37.     if data[0] != 0x46:
  38.         raise TypeError("Wrong frame")
  39.     frame, prediction, low_pressure, high_pressure_nibble, checksum =  struct.unpack("<bx4b", data)
  40.     weather = ["Partly Cloudy", "Rainy", "Cloudy", "Sunny", "Snowy"]
  41.     prediction >>= 4
  42.     try:
  43.         prediction = weather[prediction]
  44.     except IndexError:
  45.         raise TypeError("Unknown prediction")
  46.     high_pressure_nibble &= 0x0f
  47.     pressure = high_pressure_nibble << 8 | low_pressure
  48.     return Pressure(frame, prediction, pressure)
  49.  
  50.  
  51. def handle_temperature(data):
  52.     if data[0] != 0x42:
  53.         raise TypeError("Wrong frame")
  54.     frame, sensor_id, temp, humidity, power_supply, checksum = struct.unpack("<2bh2b3xb", data)
  55.     sensor_id &= 0x0F
  56.     temp /= 10
  57.     psu = {0x50: "no AC", 0x6E: "AC OK"}
  58.     return Temperature(frame, sensor_id, temp, humidity, psu.get(power_supply, "Unkown Power Supply"), checksum)
  59.  
  60.  
  61. def handle_wind(data):
  62.     if data[0] != 0x48:
  63.         raise TypeError("Wrong frame")
  64.     frame, direction, speed, checksum = struct.unpack("<2bxb4xb", data)
  65.     direction &= 0x0F
  66.     directions = "N E S W".split()
  67.     return Wind(frame, directions[direction], speed * 0.1, speed * 0.36, checksum)
  68.  
  69.  
  70. def handle_hexstr(text):
  71.     data = binascii.unhexlify(text.replace(" ",""))
  72.     try:
  73.         func_name = FRAMES[data[0]]
  74.         func = globals()[func_name]
  75.     except KeyError as e:
  76.         raise TypeError("Frame Type is not known") from e
  77.     return func.__name__, func(data)
  78.  
  79.    
  80.    
  81. def main_loop():
  82.     """
  83.    Testfunktion
  84.    """
  85.     time_stamp = None
  86.     temperature = None
  87.     pressure = None
  88.     wind = None
  89.    
  90.     while True:
  91.         hex_str = input("Bitte Hex Sting eingeben: ")
  92.         func_name, result = handle_hexstr(hex_str)
  93.         if isinstance(result, Datetime):
  94.             time_stamp = result.datetime
  95.         elif isinstance(result, Temperature):
  96.             temperature = result.temperature
  97.         elif isinstance(result, Pressure):
  98.             pressure = result.pressure
  99.         elif isinstance(result, Wind):
  100.             wind = result.speed_mph
  101.         print(time_stamp, temperature, pressure, wind)
  102.        
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement