probably final
This commit is contained in:
		
							
								
								
									
										129
									
								
								power_mqtt1.py
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								power_mqtt1.py
									
									
									
									
									
								
							@@ -4,14 +4,10 @@ import smbus
 | 
				
			|||||||
import time
 | 
					import time
 | 
				
			||||||
import paho.mqtt.client as mqt
 | 
					import paho.mqtt.client as mqt
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
from datetime import timedelta
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
bus = smbus.SMBus(1)
 | 
					bus = smbus.SMBus(1)
 | 
				
			||||||
mqtc = mqt.Client()
 | 
					mqtc = mqt.Client()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
access = {}
 | 
					access = {}
 | 
				
			||||||
# [ code : [last_access, penalty] ]
 | 
					# [ code : [last_access, penalty] ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -34,16 +30,6 @@ def millis_since(start_time):
 | 
				
			|||||||
    ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
 | 
					    ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
 | 
				
			||||||
    return ms
 | 
					    return ms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Settings for connection
 | 
					 | 
				
			||||||
host = "10.42.0.244"
 | 
					 | 
				
			||||||
topic= "foobar/oben/licht"
 | 
					 | 
				
			||||||
port = 1883
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Callbacks
 | 
					 | 
				
			||||||
rc = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def on_connect(mosq, obj, foo ,bar ):
 | 
					def on_connect(mosq, obj, foo ,bar ):
 | 
				
			||||||
    print( "Connected" )
 | 
					    print( "Connected" )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -54,22 +40,6 @@ def on_message(mosq, obj, msg):
 | 
				
			|||||||
def on_subscribe(mosq, obj, mid, granted_qos):
 | 
					def on_subscribe(mosq, obj, mid, granted_qos):
 | 
				
			||||||
    print("Subscribed OK")
 | 
					    print("Subscribed OK")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Set callbacks
 | 
					 | 
				
			||||||
mqtc.on_message = on_message
 | 
					 | 
				
			||||||
mqtc.on_connect = on_connect
 | 
					 | 
				
			||||||
mqtc.on_subscribe = on_subscribe
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Connect and subscribe
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def init_mqtt():
 | 
					 | 
				
			||||||
    mqtc.connect(host, port, 60)
 | 
					 | 
				
			||||||
    mqtc.subscribe(topic, 0)
 | 
					 | 
				
			||||||
    rc  = 0
 | 
					 | 
				
			||||||
    while rc == 0:
 | 
					 | 
				
			||||||
        rc = mqtc.loop()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#Funktion Setze Bit in Variable / Function Set Bit in byte
 | 
					#Funktion Setze Bit in Variable / Function Set Bit in byte
 | 
				
			||||||
def set_bit(value, bit):
 | 
					def set_bit(value, bit):
 | 
				
			||||||
    return value | (1<<bit)
 | 
					    return value | (1<<bit)
 | 
				
			||||||
@@ -78,6 +48,28 @@ def set_bit(value, bit):
 | 
				
			|||||||
def clear_bit(value, bit):
 | 
					def clear_bit(value, bit):
 | 
				
			||||||
    return value & ~(1<<bit)
 | 
					    return value & ~(1<<bit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def i2c_status_thread():
 | 
				
			||||||
 | 
					    global state
 | 
				
			||||||
 | 
					    #ports = (0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F)
 | 
				
			||||||
 | 
					    #         bael loun cant flur
 | 
				
			||||||
 | 
					    #         leba e    ina
 | 
				
			||||||
 | 
					    #         d
 | 
				
			||||||
 | 
					    names = { "flur", "baellebad", "lounge-front", "lounge-back", "baellebad-ein", "lounge-ein", "cantina-ein", "zentral-aus", "cantina"}
 | 
				
			||||||
 | 
					    ports = (0xF7,0xFF,0xFF,0xFE,0xFD,0xFF,0xFF,0xFF,0xFB)
 | 
				
			||||||
 | 
					    inputs = (0x23,0x21)   
 | 
				
			||||||
 | 
					    while True:
 | 
				
			||||||
 | 
					        byte = bus.read_byte(inputs[0])
 | 
				
			||||||
 | 
					        update = map( lambda x: 1 if (byte | x == x) else 0 , ports)
 | 
				
			||||||
 | 
					        byte = bus.read_byte(inputs[1])
 | 
				
			||||||
 | 
					        update[:8] = map( lambda x: 1 if (byte | x == x) else 0 , ports[:8])
 | 
				
			||||||
 | 
					        for i,j,n in state,update,names:
 | 
				
			||||||
 | 
					            if i != j:
 | 
				
			||||||
 | 
					                if n in power:
 | 
				
			||||||
 | 
					                    mqtc.publish("foobar/oben/" + n + "/strom/status", states[j], qos=0, retain=False)
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    mqtc.publish("foobar/oben/" + n + "/licht/status", states[j], qos=0, retain=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        time.sleep(5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#Buttonbefehle
 | 
					#Buttonbefehle
 | 
				
			||||||
def switch(i,speed=0.5):
 | 
					def switch(i,speed=0.5):
 | 
				
			||||||
@@ -96,40 +88,50 @@ def switch(i,speed=0.5):
 | 
				
			|||||||
            o = clear_bit(o,i)
 | 
					            o = clear_bit(o,i)
 | 
				
			||||||
            bus.write_byte(0x3f,255-o)
 | 
					            bus.write_byte(0x3f,255-o)
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					state = [0,0,0,0,0,0,0,0,0,0]
 | 
				
			||||||
 | 
					states = {0: "OFF", 1: "ON"}
 | 
				
			||||||
commands = { "flur" : 0, "baellebad" : 1, "lounge-front": 2, "lounge-back" : 3,"baellebad-ein" : 4, "lounge-ein" : 5, "cantina-ein" : 6, "zentral-aus" : 7, "cantina" : 8}
 | 
					commands = { "flur" : 0, "baellebad" : 1, "lounge-front": 2, "lounge-back" : 3,"baellebad-ein" : 4, "lounge-ein" : 5, "cantina-ein" : 6, "zentral-aus" : 7, "cantina" : 8}
 | 
				
			||||||
power = { "zentral-aus" : 7 , "baellebad" : 4, "lounge" : 5, "cantina" : 6 }
 | 
					power = { "zentral" : 7 , "baellebad" : 4, "lounge" : 5, "cantina" : 6 }
 | 
				
			||||||
light = { "flur" : 0, "baellebad" : 1, "lounge-front" : 2, "lounge-back" : 3, "cantina" : 8 }
 | 
					light = { "flur" : 0, "baellebad" : 1, "lounge-front" : 2, "lounge-back" : 3, "cantina" : 8 }
 | 
				
			||||||
state  = []
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
def decode_topic(topic):
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# foobar/oben/lounge   /licht/action
 | 
				
			||||||
 | 
					#             cantina  /strom/status
 | 
				
			||||||
 | 
					#             flur
 | 
				
			||||||
 | 
					#             baellebad
 | 
				
			||||||
 | 
					#             zentral 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def switch_state(i, state):
 | 
				
			||||||
 | 
					    if state[i] != state: # changed
 | 
				
			||||||
 | 
					        switch(i)
 | 
				
			||||||
 | 
					        state[i] = state
 | 
				
			||||||
 | 
					        return True
 | 
				
			||||||
 | 
					    return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def decode_topic(topic, state):
 | 
				
			||||||
    #lazy
 | 
					    #lazy
 | 
				
			||||||
    parts = topic.explode("/")
 | 
					    print("dummy")
 | 
				
			||||||
    if parts[0] == "foobar" and parts[4] == "action":
 | 
					    list = topic.split('/')
 | 
				
			||||||
        if parts[2] == "licht":
 | 
					    if list[3] == "licht":
 | 
				
			||||||
            return (parts[3],lights)
 | 
					        if list[2] in light:
 | 
				
			||||||
        elif parts[2] == "power":
 | 
					            if switch_state(light[list[2]], state):
 | 
				
			||||||
            return (parts[3],power)
 | 
					                mqtc.publish(topic.replace("action", "status"), states[state], qos=0, retain=False)
 | 
				
			||||||
    return ("err", [] )
 | 
					    elif list[3] == "strom":
 | 
				
			||||||
 | 
					        if list[2] in power:
 | 
				
			||||||
 | 
					            if switch_state(power[list[2]], state):
 | 
				
			||||||
 | 
					                mqtc.publish(topic.replace("action", "status"), states[state], qos=0, retain=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def msgs(inp, topic):
 | 
					def msgs(inp, topic):
 | 
				
			||||||
    c = inp.decode("utf-8")
 | 
					    c = inp.decode("utf-8")
 | 
				
			||||||
    l = len(c)
 | 
					    l = len(c)
 | 
				
			||||||
    # supporting number commands
 | 
					    # supporting number commands
 | 
				
			||||||
    if c == "OFF" or c == "ON":
 | 
					    if c == "OFF" or c == "ON":
 | 
				
			||||||
        (name,lookup) = decode_topic(topic)
 | 
					        if c.find("ON") >= 0:
 | 
				
			||||||
        if name == "err":
 | 
					            decode_topic(topic, 1)
 | 
				
			||||||
            return
 | 
					        elif c.find("OFF") >= 0:
 | 
				
			||||||
        switch(lookup[name])
 | 
					            decode_topic(topic, 0)
 | 
				
			||||||
        if i in state:
 | 
					        return
 | 
				
			||||||
            if state[i] == 0:
 | 
					 | 
				
			||||||
                state[i] = 1
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                state[i] = 0
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            state[i] = 1
 | 
					 | 
				
			||||||
        #later: send status based on state[i]
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
    elif l < 3:
 | 
					    elif l < 3:
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            msg = int(inp)
 | 
					            msg = int(inp)
 | 
				
			||||||
@@ -178,8 +180,23 @@ def msgs(inp, topic):
 | 
				
			|||||||
    return
 | 
					    return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def init_mqtt():
 | 
				
			||||||
 | 
					    mqtc.connect("10.42.0.244", 1883, 60)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/licht", 0)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/lounge-back/licht/action", 0)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/lounge-front/licht/action", 0)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/lounge/strom/action", 0)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/baellebad/licht/action", 0)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/baellebad/strom/action", 0)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/cantina/licht/action", 0)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/cantina/strom/action", 0)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/flur/licht/action", 0)
 | 
				
			||||||
 | 
					    mqtc.subscribe("foobar/oben/licht", 0)
 | 
				
			||||||
 | 
					    mqtc.on_message = on_message
 | 
				
			||||||
 | 
					    mqtc.on_connect = on_connect
 | 
				
			||||||
 | 
					    mqtc.on_subscribe = on_subscribe
 | 
				
			||||||
 | 
					    mqtc.loop_forever()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
init_mqtt()
 | 
					init_mqtt()
 | 
				
			||||||
while 1:
 | 
					 | 
				
			||||||
    time.sleep(10)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# vim: noai:ts=4:sw=4
 | 
					# vim: noai:ts=4:sw=4
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user