diff --git a/src/config.py.example b/src/config.py.example index 514c71e..b244199 100644 --- a/src/config.py.example +++ b/src/config.py.example @@ -37,7 +37,7 @@ qos = 0 # this is the time between executiuons if the script is used as service (--service option) service_sleep_time = 120 - +update_check_interval = 3600 # 1 hour cpu_load = True cpu_temp = True used_space = True diff --git a/src/rpi-cpu2mqtt.py b/src/rpi-cpu2mqtt.py index 7bbbdd4..05e771e 100644 --- a/src/rpi-cpu2mqtt.py +++ b/src/rpi-cpu2mqtt.py @@ -17,6 +17,7 @@ import threading import update import config + # get device host name - used in mqtt topic hostname = socket.gethostname() @@ -146,7 +147,8 @@ def get_manufacturer(): def check_git_update(script_dir): - if config.version == update.check_git_version_remote(script_dir): + remote_version = update.check_git_version_remote(script_dir) + if config.version == remote_version: git_update = { "installed_ver": config.version, "new_ver": config.version, @@ -154,11 +156,12 @@ def check_git_update(script_dir): else: git_update = { "installed_ver": config.version, - "new_ver": update.check_git_version_remote(script_dir), + "new_ver": remote_version, } return(json.dumps(git_update)) + def check_git_version(script_dir): full_cmd = "git -C {} describe --tags `git -C {} rev-list --tags --max-count=1`".format(script_dir, script_dir) git_version = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].decode("utf-8").replace('\n', '') @@ -166,8 +169,6 @@ def check_git_version(script_dir): return(git_version) - - def get_network_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: @@ -180,6 +181,7 @@ def get_network_ip(): s.close() return IP + def print_measured_values( cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_clock_speed=0, swap=0, memory=0, uptime_days=0, uptime_seconds = 0, wifi_signal=0, wifi_signal_dbm=0, rpi5_fan_speed=0, git_update=False): print(":: rpi-mqtt-monitor") @@ -210,6 +212,7 @@ def print_measured_values( cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_ print(" Update Available: " + str(git_update)) print("") + def config_json(what_config): model_name = check_model_name() manufacturer = get_manufacturer() @@ -323,6 +326,7 @@ def on_log(client, userdata, level, buf): if level == paho.MQTT_LOG_ERR: print("MQTT error: ", buf) + def on_connect(client, userdata, flags, rc): if rc != 0: print("Error: Unable to connect to MQTT broker, return code:", rc) @@ -478,6 +482,7 @@ def parse_arguments(): exit() return args + def gather_and_send_info(): while True: # set all monitored values to False in case they are turned off in the config @@ -514,20 +519,17 @@ def gather_and_send_info(): wifi_signal_dbm = check_wifi_signal('dbm') if config.rpi5_fan_speed: rpi5_fan_speed = check_rpi5_fan_speed() - if config.git_update: - git_update = check_git_update(script_dir) - if config.update: - update = check_git_update(script_dir) # Display collected values on screen if --display option is used if args.display: + if config.git_update: git_update = check_git_update(script_dir) print_measured_values(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed, git_update) # Publish messages to MQTT if hasattr(config, 'group_messages') and config.group_messages: - bulk_publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed, git_update) + bulk_publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed) else: - publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed, git_update, update) + publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed) # if not running as a service, break the loop after one iteration if not args.service: @@ -535,6 +537,14 @@ def gather_and_send_info(): # if running as a service, sleep before the next iteration time.sleep(config.service_sleep_time) + +def update_status(): + while True: + git_update = update = check_git_update(script_dir) + publish_to_mqtt(update, git_update) + time.sleep(config.update_check_interval) + + def on_message(client, userdata, msg): global exit_flag print("Received message: ", msg.payload.decode()) @@ -546,6 +556,7 @@ def on_message(client, userdata, msg): exit_flag = False + if __name__ == '__main__': script_dir = os.path.dirname(os.path.realpath(__file__)) args = parse_arguments(); @@ -563,10 +574,17 @@ if __name__ == '__main__': client.subscribe("homeassistant/update/" + hostname + "/command") # Replace with your MQTT topic print("Listening to topic : " + "homeassistant/update/" + hostname + "/command") + # Start the gather_and_send_info function in a new thread - thread = threading.Thread(target=gather_and_send_info) - thread.daemon = True # Set the daemon attribute to True - thread.start() + thread1 = threading.Thread(target=gather_and_send_info) + thread1.daemon = True # Set the daemon attribute to True + thread1.start() + + if config.update: + # Start the update_status function in a new thread + thread2 = threading.Thread(target=update_status) + thread2.daemon = True # Set the daemon attribute to True + thread2.start() client.loop_start() # Start the MQTT client loop in a new thread diff --git a/src/update.py b/src/update.py index a47e23a..0aae7fc 100644 --- a/src/update.py +++ b/src/update.py @@ -50,7 +50,12 @@ def display_config_differences(current_config, example_config, display=True): def check_git_version_remote(script_dir): full_cmd = "git -C {} ls-remote --tags origin | awk -F'/' '{{print $3}}' | sort -V | tail -n 1".format(script_dir) - result = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].decode("utf-8") + try: + result = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].decode("utf-8") + except subprocess.CalledProcessError as e: + print("Error: {}".format(e)) + return None + latest_tag = result.strip() return latest_tag if latest_tag else None