1wire2mqtt/post2mqtt.py

94 lines
2.2 KiB
Python
Raw Normal View History

2026-03-15 10:05:07 +01:00
#!/usr/bin/python
import sys, string, time, atexit
import paho.mqtt.client as mqtt
# ---- Configuration START ----
topic = 'neues-haus/keller/tele/werkstatt/'
mqttBroker = '192.168.0.11'
mqttPort = 1883
mqttuser = 'werkstatt-pi'
mqttpasswort = 'h#st0$HYWq1Z2*'
valuesFile = '/opt/1wire/output'
maxDataAge = 300 # [s]
minTemp = -10.0 # [°C], for simple sanity check
maxTemp = 35.0 # [°C], for simple sanity check
debug = True
# ---- Configuration END ----
# MQTT init
def on_connect(client, userdata, flags, rc, properties):
if rc != 0:
print("Connection to MQTT broker failed with rc = ", rc)
try:
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, 'werkstatt-pi')
client.username_pw_set(mqttuser, mqttpasswort)
client.on_connect = on_connect
client.connect(mqttBroker, port=mqttPort)
client.loop_start()
except:
print('Connection to MQTT broker failed')
sys.exit()
# Function definitions
def exit_handler():
client.publish(topic + 'LWT', 'Offline', 0, True)
def getValues():
values = {}
with open(valuesFile,"r") as f:
for line in f:
if debug:
print('line = ' + line)
splitted = line.split('=')
if len(splitted) == 2:
values[splitted[0].strip()] = splitted[1].strip()
return values
def publishMetrics():
payload = '{ "timestamp": "' + values['Timestamp'] + '"'
for key in ['LuftTemp', 'WasserTemp', 'BodenTemp']:
if key in values and float(values[key]) >= minTemp and float(values[key]) <= maxTemp:
payload = payload + ', "' + key + '": "' + values[key] + '"'
if debug:
print(key + ' = ' + values[key] + ' °C')
payload = payload + ' }'
if debug:
print('payload = ' + payload)
client.publish(topic + 'SENSOR', payload)
# Main
client.publish(topic + 'LWT', 'Online', 0, True)
atexit.register(exit_handler)
while(1):
values = getValues()
if not 'Timestamp' in values:
continue
dataAge = int(time.time() - int(values['Timestamp']))
if debug:
print('Data age = ' + str(dataAge) + ' seconds')
if dataAge > maxDataAge:
continue
publishMetrics()
time.sleep(60)