Skip to content

Instantly share code, notes, and snippets.

@sja
Created May 27, 2017 19:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sja/0ce0cc5fa4dc45483c29c79a08004269 to your computer and use it in GitHub Desktop.
Save sja/0ce0cc5fa4dc45483c29c79a08004269 to your computer and use it in GitHub Desktop.
Homie Eingang
{
"HOST": "x.x.x.x",
"PORT": 1883,
"KEEPALIVE": 10,
"USERNAME": "",
"PASSWORD": "",
"CA_CERTS": "",
"DEVICE_ID": "eingang",
"DEVICE_NAME": "Eingang Lampe und Kamera",
"TOPIC": "homie"
}
#!/usr/bin/env python
# install deps:
# apt-get install python-pip python-dev
# pip install wiringpi
#
import time
import homie
import logging
import wiringpi as wpi
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
PIN_SERVO = 18
PIN_LAMP = 23
wpi.wiringPiSetupGpio()
wpi.pinMode(PIN_LAMP, wpi.GPIO.OUTPUT)
wpi.pinMode(PIN_SERVO, wpi.GPIO.PWM_OUTPUT)
wpi.pwmSetMode(wpi.GPIO.PWM_MODE_MS)
wpi.pwmSetClock(192)
wpi.pwmSetRange(2000)
Homie = homie.Homie("config.json")
switchNode = Homie.Node("lampe", "ESH:Light")
servoNode = Homie.Node("kamera", "ESH:Temperature")
def angleHandler(mqttc, obj, msg):
# in-range: 0-100 out-range: 70-270 (was 50-250)
percent = int(msg.payload.decode("UTF-8"))
angle = percent * 2 + 70
if angle < 50 or angle > 270:
logger.error("Invalid value: %s", angle)
return
logger.info("Servo: %s", angle)
wpi.pwmWrite(PIN_SERVO, angle)
Homie.setNodeProperty(servoNode, "percent", percent, True)
def switchOnHandler(mqttc, obj, msg):
payload = msg.payload.decode("UTF-8").lower()
if payload == 'true' or payload == 'on':
logger.info("Switch: ON")
wpi.digitalWrite(PIN_LAMP, 1)
Homie.setNodeProperty(switchNode, "value", "true", True)
else:
logger.info("Switch: OFF")
wpi.digitalWrite(PIN_LAMP, 0)
Homie.setNodeProperty(switchNode, "value", "false", True)
def main():
Homie.setFirmware("eingang", "1.1.0")
Homie.subscribe(switchNode, "value", switchOnHandler)
Homie.subscribe(servoNode, "value", angleHandler)
Homie.setup()
logger.info("Ready.")
Homie.setNodeProperty(switchNode, "itemtype", "Switch")
Homie.setNodeProperty(switchNode, "$type", "ESH:Light")
Homie.setNodeProperty(servoNode, "itemtype", "Number")
Homie.setNodeProperty(servoNode, "$type", "ESH:Temperature")
Homie.setNodeProperty(servoNode, "min", "0")
Homie.setNodeProperty(servoNode, "max", "100")
while True:
time.sleep(1)
if __name__ == '__main__':
try:
main()
except (KeyboardInterrupt, SystemExit):
logger.info("Quitting.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment