Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:post-factum:monitoring
temperhumd
_service:obs_scm:temperhumd-src.obscpio
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:temperhumd-src.obscpio of Package temperhumd
07070100000000000081A40000000000000000000000016294A3B9000000D4000000000000000000000000000000000000002200000000temperhumd-src/98-temperhum.rulesACTION!="remove", SUBSYSTEM=="usb", ATTRS{idVendor}=="413d", ATTRS{idProduct}=="2107", TAG+="systemd", ENV{SYSTEMD_ALIAS}="/sys/subsystem/usb/devices/temperhum", MODE="0660", OWNER="temperhum", GROUP="temperhum" 07070100000001000081A40000000000000000000000016294A3B900000030000000000000000000000000000000000000002200000000temperhumd-src/temperhum.sysusersu temperhum - "TEMPerHUM" - - g temperhum - - - 07070100000002000081ED0000000000000000000000016294A3B900000C8C000000000000000000000000000000000000001A00000000temperhumd-src/temperhumd#!/usr/bin/env python import logging import os import signal import struct import time import usb.core import usb.util from prometheus_client import start_http_server, Gauge, REGISTRY for i in list(REGISTRY._collector_to_names.keys()): REGISTRY.unregister(i) TH_VENDOR = 0x413d TH_PRODUCT = 0x2107 TH_INTERFACE = 1 TH_SELFHEAT = 1.86 TH_CMD = struct.pack('hhhh', -0x7fff, 0x133, 0, 0) TH_POLL_INTERVAL = 30 TH_METRICS_PORT = 64901 CLIMATE_TEMPERATURE_ROOM = Gauge('climate_temperature_room', 'Room temperature in °C') CLIMATE_RELATIVE_HUMIDITY_ROOM = Gauge('climate_relative_humidity_room', 'Room relative humidity in %') device = None logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) def twos_complement(value, bits): if value & (1 << (bits - 1)): value -= 1 << bits return value def open_device(): global device device = usb.core.find(idVendor = TH_VENDOR, idProduct = TH_PRODUCT) if device is None: logger.error("Unable to find USB device") exit(os.EX_OSERR) is_kernel_driver_active = False try: is_kernel_driver_active = device.is_kernel_driver_active(1) except: logger.error("Unable to get USB device kernel driver state") exit(os.EX_OSERR) if is_kernel_driver_active: result = device.detach_kernel_driver(1) if result != None: logger.error("Unable to detach USB device kernel driver") exit(os.EX_OSERR) cfg = device[0] iface = cfg[TH_INTERFACE, 0] result = usb.util.claim_interface(device, TH_INTERFACE) if result != None: logger.error("Unable to claim USB device interface") exit(os.EX_OSERR) ep_read = iface[0] ep_write = iface[1] ep_read_addr = ep_read.bEndpointAddress ep_write_addr = ep_write.bEndpointAddress return ep_read_addr, ep_write_addr def poll_device(ep_read_addr, ep_write_addr): try: device.write(ep_write_addr, TH_CMD) except: logger.error("Unable to write to USB device") disgraceful_exit() try: data = device.read(ep_read_addr, 0x8) except: logger.error("Unable to read from USB device") disgraceful_exit() temperature = round(twos_complement((data[2] * 256) + data[3], 16) / 100 - TH_SELFHEAT, 2) humidity = round(((data[4] * 256) + data[5]) / 100, 2) CLIMATE_TEMPERATURE_ROOM.set(temperature) CLIMATE_RELATIVE_HUMIDITY_ROOM.set(humidity) def close_device(): result = usb.util.dispose_resources(device) if result != None: logger.error("Unable to close USB device") exit(os.EX_OSERR) def graceful_exit(): close_device() exit(os.EX_OK) def disgraceful_exit(): close_device() exit(os.EX_OSERR) def sigterm_handler(_signo, _stack_frame): graceful_exit() if __name__ == '__main__': signal.signal(signal.SIGINT, sigterm_handler) signal.signal(signal.SIGTERM, sigterm_handler) ep_read_addr, ep_write_addr = open_device() ready = False while True: poll_device(ep_read_addr, ep_write_addr) if not ready: ready = True start_http_server(TH_METRICS_PORT) time.sleep(TH_POLL_INTERVAL) 07070100000003000081A40000000000000000000000016294A3B90000037E000000000000000000000000000000000000002800000000temperhumd-src/temperhumd-proxy.service[Unit] Requires=temperhumd-proxy.socket After=temperhumd-proxy.socket JoinsNamespaceOf=temperhumd.service BindsTo=temperhumd.service [Service] User=temperhum Group=temperhum CapabilityBoundingSet= RestrictAddressFamilies=AF_INET RestrictNamespaces=true IPAddressAllow=localhost IPAddressDeny=any NoNewPrivileges=true PrivateDevices=true PrivateUsers=true ProtectClock=true ProtectControlGroups=true ProtectHome=true ProtectKernelLogs=true ProtectKernelModules=true ProtectKernelTunables=true ProtectProc=invisible ProcSubset=pid ProtectSystem=strict RestrictSUIDSGID=true SystemCallArchitectures=native SystemCallFilter=@system-service SystemCallFilter=~@privileged @resources RestrictRealtime=true LockPersonality=true MemoryDenyWriteExecute=true RemoveIPC=true UMask=0066 ProtectHostname=true ExecStart=/usr/lib/systemd/systemd-socket-proxyd 127.0.0.1:64901 PrivateTmp=yes PrivateNetwork=yes07070100000004000081A40000000000000000000000016294A3B90000003E000000000000000000000000000000000000002700000000temperhumd-src/temperhumd-proxy.socket[Unit] BindsTo=temperhumd.service [Socket] ListenStream=6490107070100000005000081A40000000000000000000000016294A3B9000003DC000000000000000000000000000000000000002200000000temperhumd-src/temperhumd.service[Unit] Description=Poll TEMPerHUM device and export Prometheus metrics After=sys-subsystem-usb-devices-temperhum.device BindsTo=sys-subsystem-usb-devices-temperhum.device Requires=temperhumd-proxy.socket [Service] User=temperhum Group=temperhum RemoveIPC=true CapabilityBoundingSet= NoNewPrivileges=true ProtectKernelLogs=true ProtectControlGroups=true ProtectKernelModules=true PrivateMounts=true SystemCallArchitectures=native MemoryDenyWriteExecute=true RestrictNamespaces=true RestrictSUIDSGID=true ProtectHostname=true LockPersonality=true ProtectKernelTunables=true RestrictAddressFamilies=AF_INET AF_NETLINK RestrictRealtime=true ProtectSystem=strict ProtectProc=invisible ProcSubset=pid ProtectHome=true PrivateNetwork=true IPAddressAllow=localhost IPAddressDeny=any PrivateUsers=true PrivateTmp=true SystemCallFilter=@system-service SystemCallFilter=~@resources @privileged UMask=0066 ExecStart=/usr/bin/temperhumd [Install] WantedBy=sys-subsystem-usb-devices-temperhum.device 07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!13 blocks
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor