123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- import serial
- from time import sleep
- import os
- import sys
- import paho.mqtt.client as mqtt
- import json
- quitOnNoReceiveTimeout = 75
- statusFile = '/tmp/ioext_running'
- serialPort = '/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0'
- serialBaud = 57600
- serialTimeout = 1
- mqtt_server = "mqtt.lan"
- mqtt_port = 1883
- mqtt_user = "user"
- mqtt_password = "password"
- mqtt_base_topic = "T5/HomeSvrIOExt"
- mqtt_topic_tuerkontakt = "T5/Wohnungstuer/Tuerkontakt"
- mqtt_topic_pir1 = "T5/VZ/PIR1"
- mqtt_topic_pir2 = "T5/VZ/PIR2"
- mqtt_topic_out_temp = "T5/Abstr/Sensors/temp"
- mqtt_topic_out_hum = "T5/Abstr/Sensors/hum"
- noReceiveCount = 0
- verbose = False
- debug = False
- quiet = True
- lastState_tk = None
- lastState_pir1 = None
- lastState_pir2 = None
- if len(sys.argv) >= 2:
- if sys.argv[1] == "-q":
- verbose = False
- debug = False
- quiet = True
-
- elif sys.argv[1] == "-v":
- verbose = True
- debug = False
- quiet = False
-
- elif sys.argv[1] == "-d":
- verbose = True
- quiet = False
- debug = True
-
- def on_connect(client, userdata, flags, rc):
- if not quiet:
- print("MQTT connected with result code " + str(rc))
-
-
- def touch(fname, times=None):
- with open(fname, 'a'):
- os.utime(fname, times)
- mqttc = mqtt.Client()
- mqttc.on_connect = on_connect
- mqttc.username_pw_set(mqtt_user, mqtt_password)
- mqttc.connect(mqtt_server, mqtt_port, 60)
- mqttc.loop_start()
- ser = serial.Serial(port=serialPort,
- baudrate = serialBaud,
- parity=serial.PARITY_NONE,
- stopbits=serial.STOPBITS_ONE,
- bytesize=serial.EIGHTBITS,
- timeout=serialTimeout)
-
- try:
- while True:
-
-
- serLine = ser.readline().strip()
-
- try:
- serLine = serLine.decode('ascii')
- except:
- serLine = ""
-
-
- if(serLine):
- noReceiveCount = 0
- touch(statusFile)
-
-
-
- if verbose:
- print ('RX: ' + repr(serLine))
- mqttc.publish(mqtt_base_topic + "/RX", str(serLine), qos=0, retain=False)
-
-
- if serLine.startswith('P2='):
- newState = None
- if serLine == "P2=L":
- newState = "OFF"
- elif serLine == "P2=H":
- newState = "ON"
-
- if newState is not None and lastState_tk != newState:
- lastState_tk = newState
- mqttc.publish(mqtt_topic_tuerkontakt, newState, qos=0, retain=False)
-
-
- if serLine.startswith('P3='):
- newState = None
- if serLine == "P3=L":
- newState = "OFF"
- elif serLine == "P3=H":
- newState = "ON"
-
- if newState is not None and lastState_pir1 != newState:
- lastState_pir1 = newState
- mqttc.publish(mqtt_topic_pir1, newState, qos=0, retain=False)
-
-
- if serLine.startswith('P4='):
- newState = None
- if serLine == "P4=L":
- newState = "OFF"
- elif serLine == "P4=H":
- newState = "ON"
-
- if newState is not None and lastState_pir2 != newState:
- lastState_pir2 = newState
- mqttc.publish(mqtt_topic_pir2, newState, qos=0, retain=False)
-
-
-
- if serLine.startswith('{"T":'):
- th = json.loads(serLine)
- t = round(float(th["T"]), 1)
- h = int(th["H"])
- if t >= -20 and t <= 50:
- mqttc.publish(mqtt_topic_out_temp, str(t), qos=0, retain=False)
- if h >= 0 and h <= 100:
- mqttc.publish(mqtt_topic_out_hum, str(h), qos=0, retain=False)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- else:
- noReceiveCount += 1
- if debug:
- print("noReceiveCount=" + str(noReceiveCount))
-
-
- if noReceiveCount >= quitOnNoReceiveTimeout:
- quit()
-
-
-
-
-
-
-
-
-
-
-
- except KeyboardInterrupt:
- print('\n')
|