# monitor.py 27/09/2015 D.J.Whale # # Monitor settings of Energine MiHome plugs import time import pprint from energenie import OpenHEMS, radio def trace(msg): print(str(msg)) #----- TIMER ------------------------------------------------------------------ class Timer(): def __init__(self, ratesec=1): self.rate = ratesec self.nexttick = time.time() def check(self): """Maintain the timer and see if it is time for the next tick""" now = time.time() if now >= self.nexttick: # asynchronous tick, might drift, but won't stack up if late self.nexttick = now + self.rate return True return False #----- TEST APPLICATION ------------------------------------------------------- class ENERGENIE(): MFRID = 0x04 PRODUCTID_C1_MONITOR = 0x01 PRODUCTID_R1_MONITOR_AND_CONTROL = 0x02 CRYPT_PID = 242 CRYPT_PIP = 0x0100 MONITOR_MESSAGE = { "header": { "mfrid": ENERGENIE.MFRID, "productid": ENERGENIE.PRODUCTID_C1_MONITOR, "encryptPIP": ENERGENIE.CRYPT_PIP, "sensorid": 0xFFFFFF }, "recs": [ { "wr": True, "paramid": OpenHEMS.PARAM_SWITCH_STATE, "typeid": 0x00, "length": 0x01, "value": 0x00 } ] } def monitor(): """Send monitor poke messages and capture any responses""" sendMonitorTimer = Timer(3) pollReceiveTimer = Timer(1) radio.receiver() while True: # See if there is a payload, and if there is, process it if pollReceiveTimer.check(): if radio.isReceiveWaiting(): trace("receiving payload") payload = radio.receive() decoded = OpenHEMS.decode(payload) pprint.pprint(decoded) # If it is time to send a monitor message, send it if sendMonitorTimer.check(): trace("sending monitor message") payload = OpenHEMS.encode(MONITOR_MESSAGE) radio.transmitter() radio.transmit(payload) radio.receiver() # Keep in receiver mode as much as possible if __name__ == "__main__": radio.init() OpenHEMS.init(ENERGENIE.CRYPT_PID) try: monitor() finally: radio.finished() # END