inital version with mqtt
This commit is contained in:
@@ -3,12 +3,13 @@
|
|||||||
"""dependencys:
|
"""dependencys:
|
||||||
- pip3 install nagiosplugin
|
- pip3 install nagiosplugin
|
||||||
- pip3 install argparse
|
- pip3 install argparse
|
||||||
|
- pip3 install paho-mqtt
|
||||||
- pip3 install git+https://github.com/heinemml/CO2Meter
|
- pip3 install git+https://github.com/heinemml/CO2Meter
|
||||||
or
|
or
|
||||||
- pip3 install git+https://git.ao-it.net/python/CO2Meter
|
- pip3 install git+https://git.ao-it.net/python/CO2Meter
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__version__ = '0.4.0'
|
__version__ = '0.5.0'
|
||||||
__author__ = 'anima'
|
__author__ = 'anima'
|
||||||
|
|
||||||
# imports
|
# imports
|
||||||
@@ -19,7 +20,6 @@ from time import sleep
|
|||||||
from os import path
|
from os import path
|
||||||
import re
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
import socket
|
|
||||||
import threading
|
import threading
|
||||||
import nagiosplugin
|
import nagiosplugin
|
||||||
|
|
||||||
@@ -108,9 +108,12 @@ class AirQServer(AirQLocal):
|
|||||||
logging.debug(f'start AirQ in server mode')
|
logging.debug(f'start AirQ in server mode')
|
||||||
thread_data = threading.Thread(target=self.get_local_data_loop, group=None)
|
thread_data = threading.Thread(target=self.get_local_data_loop, group=None)
|
||||||
thread_server = threading.Thread(target=self.run_server, group=None)
|
thread_server = threading.Thread(target=self.run_server, group=None)
|
||||||
|
|
||||||
if self.get_usb_dev():
|
if self.get_usb_dev():
|
||||||
thread_data.start()
|
thread_data.start()
|
||||||
|
sleep(5)
|
||||||
thread_server.start()
|
thread_server.start()
|
||||||
|
self.threads.append(thread_data)
|
||||||
self.threads.append(thread_server)
|
self.threads.append(thread_server)
|
||||||
|
|
||||||
def stop_treads(self):
|
def stop_treads(self):
|
||||||
@@ -123,41 +126,50 @@ class AirQServer(AirQLocal):
|
|||||||
self.get_local_data()
|
self.get_local_data()
|
||||||
|
|
||||||
def run_server(self):
|
def run_server(self):
|
||||||
s = socket.socket()
|
import paho.mqtt.client as mqtt
|
||||||
s.bind(('', self.port))
|
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="AirQServer")
|
||||||
s.listen(1)
|
client.connect("localhost", self.port)
|
||||||
logging.debug(f'run AirQ server on port {self.port}')
|
logging.debug(f'run AirQ server on port {self.port}')
|
||||||
try:
|
|
||||||
while True:
|
while True:
|
||||||
conn, addr = s.accept()
|
sleep(10)
|
||||||
data = {"co2": self.co2, "temp": self.temp}
|
logging.debug(f'set {self.temp=}, {self.co2=}')
|
||||||
logging.debug(f'connection from {addr}, send {data=}')
|
client.publish("airq/temp", self.temp, retain=True)
|
||||||
conn.send(str(json.dumps(data)).encode())
|
client.publish("airq/co2", self.co2, retain=True)
|
||||||
conn.close()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
logging.debug(f'stop AirQ server')
|
|
||||||
s.close()
|
|
||||||
|
|
||||||
|
|
||||||
class AirQClient(AirQBase):
|
class AirQClient(AirQBase):
|
||||||
def __init__(self, server: str = 'localhost', port: int = 4554):
|
def __init__(self, server: str = 'localhost', port: int = 4554, mode = None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.server = server
|
self.server = server
|
||||||
self.port = port
|
self.port = port
|
||||||
logging.debug(f'start AirQ in client mode')
|
logging.debug(f'start AirQ in client mode')
|
||||||
|
self.received = {}
|
||||||
|
self.mode = mode
|
||||||
self.run_client()
|
self.run_client()
|
||||||
|
|
||||||
|
def on_message(self, client, userdata, msg):
|
||||||
|
self.received[msg.topic] = msg.payload.decode()
|
||||||
|
logging.debug(f"get {msg.topic=} with {self.received[msg.topic]=}")
|
||||||
|
client.disconnect() # end with first response
|
||||||
|
|
||||||
|
|
||||||
def run_client(self):
|
def run_client(self):
|
||||||
s = socket.socket()
|
import paho.mqtt.client as mqtt
|
||||||
s.connect((self.server, self.port))
|
|
||||||
logging.debug(f'connected to {self.server=} on {self.port=}')
|
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="AirQClient")
|
||||||
data = json.loads(s.recv(1024).decode())
|
client.on_message = self.on_message
|
||||||
logging.debug(f'server response: {data=}')
|
|
||||||
s.close()
|
client.connect(self.server, self.port)
|
||||||
if 'co2' in data.keys():
|
client.subscribe(f"airq/{self.mode}")
|
||||||
self.co2 = data['co2']
|
|
||||||
if 'temp' in data.keys():
|
client.loop_start()
|
||||||
self.temp = data['temp']
|
sleep(1)
|
||||||
|
client.loop_stop()
|
||||||
|
if self.mode == 'co2':
|
||||||
|
self.co2 = self.received[f"airq/{self.mode}"]
|
||||||
|
elif self.mode == 'temp':
|
||||||
|
self.temp = self.received[f"airq/{self.mode}"]
|
||||||
|
|
||||||
|
|
||||||
class AirQCO2Resource(nagiosplugin.Resource):
|
class AirQCO2Resource(nagiosplugin.Resource):
|
||||||
@@ -237,17 +249,17 @@ def main():
|
|||||||
if args.verbose >= 3:
|
if args.verbose >= 3:
|
||||||
logging.getLogger().setLevel(logging.DEBUG)
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
|
|
||||||
|
# dice which check will be run bases on check_mode
|
||||||
if args.check_mode != 'server':
|
if args.check_mode != 'server':
|
||||||
if args.airq_mode == 'local':
|
if args.airq_mode == 'local':
|
||||||
airq = AirQLocal(device=args.airq_device)
|
airq = AirQLocal(device=args.airq_device)
|
||||||
elif args.airq_mode == 'client':
|
elif args.airq_mode == 'client':
|
||||||
airq = AirQClient(server=args.airq_server, port=args.airq_port)
|
airq = AirQClient(server=args.airq_server, port=int(args.airq_port), mode=args.check_mode)
|
||||||
else:
|
else:
|
||||||
logging.error('Unknown airq mode')
|
logging.error('Unknown airq mode')
|
||||||
exit()
|
exit()
|
||||||
check = None
|
check = None
|
||||||
|
|
||||||
# dice which check will be run bases on check_mode
|
|
||||||
match args.check_mode:
|
match args.check_mode:
|
||||||
case 'co2':
|
case 'co2':
|
||||||
check = nagiosplugin.Check(
|
check = nagiosplugin.Check(
|
||||||
@@ -263,7 +275,7 @@ def main():
|
|||||||
check.name = "Temperature"
|
check.name = "Temperature"
|
||||||
case 'server':
|
case 'server':
|
||||||
try:
|
try:
|
||||||
airq = AirQServer(port=args.airq_port, device=args.airq_device)
|
airq = AirQServer(port=int(args.airq_port), device=args.airq_device)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
airq.stop_treads()
|
airq.stop_treads()
|
||||||
case _:
|
case _:
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
## for all checks
|
## for all checks
|
||||||
nagiosplugin
|
nagiosplugin
|
||||||
|
|
||||||
## for api checks
|
## for api checks & notifications
|
||||||
requests
|
requests
|
||||||
|
|
||||||
## for snmp checks
|
## for snmp checks
|
||||||
easysnmp
|
easysnmp
|
||||||
|
|
||||||
|
## for mqtt checks
|
||||||
|
paho-mqtt
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
## for airq
|
## for airq
|
||||||
pip3 install git+https://github.com/heinemml/CO2Meter
|
git+https://github.com/heinemml/CO2Meter
|
||||||
Reference in New Issue
Block a user