Newer
Older
pyenergenie / src / monitor.py
# monitor.py  27/09/2015  D.J.Whale
#
# Monitor settings of Energine MiHome plugs

import time
from energenie import radio, OpenHEMS

CRYPT_PID = 242
CRYPT_PIP = 0x0100

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 -------------------------------------------------------

def monitor():
    """Send monitor poke messages and capture any responses"""

    sendMonitorTimer = Timer(3)
    pollReceiveTimer = Timer(1)

    while True:
        # Keep in receiver mode as much as possible
        # but don't keep trying to switch into receiver if already there
        if radio.mode != "RECEIVER":
            radio.receiver()

        # See if there is a payload, and if there is, process it
        if pollReceiveTimer.check():
            if radio.isReceiveWaiting():
                trace("receiving payload")
                payload = radio.receive()
                trace("decoding payload")
                print(OpenHEMS.decode(payload))  # TODO decode from buffer to pydict

        # If it is time to send a monitor message, send it
        if sendMonitorTimer.check():
            trace("time for monitor")
            payload = OpenHEMS.make_monitor() # TODO encode from pydict to buffer
            radio.transmitter()
            trace("sending monitor message")
            radio.transmit(payload)


if __name__ == "__main__":

    radio.init()
    OpenHEMS.init(CRYPT_PID, CRYPT_PIP)

    try:
        monitor()

    finally:
        radio.finished()

# END