diff --git a/README.md b/README.md index bba330d..ee15cbc 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ - [Translations](#translations) - [Domoticz](#domoticz) - [MQTT Broker (e.g. HomeAssistant, ioBroker)](#mqtt-broker-eg-homeassistant-iobroker) + - [MQTT-Explorer screenshot after running monitor.py](#mqtt-explorer-screenshot-after-running-monitorpy) + - [MQTT-Explorer screenshot after running summary.py](#mqtt-explorer-screenshot-after-running-summarypy) + - [MQTT-Explorer screenshot after running dailystats.py:](#mqtt-explorer-screenshot-after-running-dailystatspy) - [monitor.py](#monitorpy) - [summary.py](#summarypy) - [summary.py sheetupdate](#summarypy-sheetupdate) @@ -199,43 +202,317 @@ In the file "monitor.cfg" there is a configuration section for domoticz: send_to_domoticz = False domot_url = http://192.168.0.222:8081 -monitor_datetime = 0 -monitor_longitude = 0 -monitor_latitude = 0 -monitor_engineon = 0 -monitor_battery12v = 0 -monitor_odometer = 0 -monitor_soc = 0 -monitor_charging = 0 -monitor_plugged = 0 -monitor_address = 0 -monitor_evrange = 0 - -trip_date = 0 -trip_starttime = 0 -trip_drivetime = 0 -trip_idletime = 0 -trip_distance = 0 -trip_avgspeed = 0 -trip_maxspeed = 0 - -dailystats_date = 0 -dailystats_distance = 0 -dailystats_distance_unit = 0 -dailystats_total_consumed = 0 -dailystats_regenerated_energy = 0 -dailystats_engine_consumption = 0 -dailystats_climate_consumption = 0 -dailystats_onboard_electronics_consumption = 0 -dailystats_battery_care_consumption = 0 +monitor_monitor_datetime = 0 +monitor_monitor_longitude = 0 +monitor_monitor_latitude = 0 +monitor_monitor_engineon = 0 +monitor_monitor_battery12v = 0 +monitor_monitor_odometer = 0 +monitor_monitor_soc = 0 +monitor_monitor_charging = 0 +monitor_monitor_plugged = 0 +monitor_monitor_address = 0 +monitor_monitor_evrange = 0 + +monitor_tripinfo_date = 0 +monitor_tripinfo_starttime = 0 +monitor_tripinfo_drivetime = 0 +monitor_tripinfo_idletime = 0 +monitor_tripinfo_distance = 0 +monitor_tripinfo_avgspeed = 0 +monitor_tripinfo_maxspeed = 0 + +monitor_dailystats_date = 0 +monitor_dailystats_distance = 0 +monitor_dailystats_distance_unit = 0 +monitor_dailystats_total_consumed = 0 +monitor_dailystats_regenerated_energy = 0 +monitor_dailystats_engine_consumption = 0 +monitor_dailystats_climate_consumption = 0 +monitor_dailystats_onboard_electronics_consumption = 0 +monitor_dailystats_battery_care_consumption = 0 + +summary_TRIP_date = 0 +summary_TRIP_info = 0 +summary_TRIP_odometer = 0 +summary_TRIP_delta_distance = 0 +summary_TRIP_kwh_charged = 0 +summary_TRIP_kwh_discharged = 0 +summary_TRIP_distance_unit_per_kwh = 0 +summary_TRIP_kwh_per_100_distance_unit = 0 +summary_TRIP_cost = 0 +summary_TRIP_soc = 0 +summary_TRIP_soc_avg = 0 +summary_TRIP_soc_min = 0 +summary_TRIP_soc_max = 0 +summary_TRIP_battery12v = 0 +summary_TRIP_battery12v_avg = 0 +summary_TRIP_battery12v_min = 0 +summary_TRIP_battery12v_max = 0 +summary_TRIP_charging_sessions = 0 +summary_TRIP_trip_count = 0 +summary_TRIP_range = 0 +summary_TRIP_address = 0 + +summary_DAY_date = 0 +summary_DAY_info = 0 +summary_DAY_odometer = 0 +summary_DAY_delta_distance = 0 +summary_DAY_kwh_charged = 0 +summary_DAY_kwh_discharged = 0 +summary_DAY_distance_unit_per_kwh = 0 +summary_DAY_kwh_per_100_distance_unit = 0 +summary_DAY_cost = 0 +summary_DAY_soc = 0 +summary_DAY_soc_avg = 0 +summary_DAY_soc_min = 0 +summary_DAY_soc_max = 0 +summary_DAY_battery12v = 0 +summary_DAY_battery12v_avg = 0 +summary_DAY_battery12v_min = 0 +summary_DAY_battery12v_max = 0 +summary_DAY_charging_sessions = 0 +summary_DAY_trip_count = 0 +summary_DAY_range = 0 +summary_DAY_address = 0 + +summary_WEEK_date = 0 +summary_WEEK_info = 0 +summary_WEEK_odometer = 0 +summary_WEEK_delta_distance = 0 +summary_WEEK_kwh_charged = 0 +summary_WEEK_kwh_discharged = 0 +summary_WEEK_distance_unit_per_kwh = 0 +summary_WEEK_kwh_per_100_distance_unit = 0 +summary_WEEK_cost = 0 +summary_WEEK_soc = 0 +summary_WEEK_soc_avg = 0 +summary_WEEK_soc_min = 0 +summary_WEEK_soc_max = 0 +summary_WEEK_battery12v = 0 +summary_WEEK_battery12v_avg = 0 +summary_WEEK_battery12v_min = 0 +summary_WEEK_battery12v_max = 0 +summary_WEEK_charging_sessions = 0 +summary_WEEK_trip_count = 0 +summary_WEEK_range = 0 +summary_WEEK_address = 0 + +summary_MONTH_date = 0 +summary_MONTH_info = 0 +summary_MONTH_odometer = 0 +summary_MONTH_delta_distance = 0 +summary_MONTH_kwh_charged = 0 +summary_MONTH_kwh_discharged = 0 +summary_MONTH_distance_unit_per_kwh = 0 +summary_MONTH_kwh_per_100_distance_unit = 0 +summary_MONTH_cost = 0 +summary_MONTH_soc = 0 +summary_MONTH_soc_avg = 0 +summary_MONTH_soc_min = 0 +summary_MONTH_soc_max = 0 +summary_MONTH_battery12v = 0 +summary_MONTH_battery12v_avg = 0 +summary_MONTH_battery12v_min = 0 +summary_MONTH_battery12v_max = 0 +summary_MONTH_charging_sessions = 0 +summary_MONTH_trip_count = 0 +summary_MONTH_range = 0 +summary_MONTH_address = 0 + +summary_YEAR_date = 0 +summary_YEAR_info = 0 +summary_YEAR_odometer = 0 +summary_YEAR_delta_distance = 0 +summary_YEAR_kwh_charged = 0 +summary_YEAR_kwh_discharged = 0 +summary_YEAR_distance_unit_per_kwh = 0 +summary_YEAR_kwh_per_100_distance_unit = 0 +summary_YEAR_cost = 0 +summary_YEAR_soc = 0 +summary_YEAR_soc_avg = 0 +summary_YEAR_soc_min = 0 +summary_YEAR_soc_max = 0 +summary_YEAR_battery12v = 0 +summary_YEAR_battery12v_avg = 0 +summary_YEAR_battery12v_min = 0 +summary_YEAR_battery12v_max = 0 +summary_YEAR_charging_sessions = 0 +summary_YEAR_trip_count = 0 +summary_YEAR_range = 0 +summary_YEAR_address = 0 + +summary_TRIPAVG_date = 0 +summary_TRIPAVG_info = 0 +summary_TRIPAVG_odometer = 0 +summary_TRIPAVG_delta_distance = 0 +summary_TRIPAVG_kwh_charged = 0 +summary_TRIPAVG_kwh_discharged = 0 +summary_TRIPAVG_distance_unit_per_kwh = 0 +summary_TRIPAVG_kwh_per_100_distance_unit = 0 +summary_TRIPAVG_cost = 0 +summary_TRIPAVG_soc = 0 +summary_TRIPAVG_soc_avg = 0 +summary_TRIPAVG_soc_min = 0 +summary_TRIPAVG_soc_max = 0 +summary_TRIPAVG_battery12v = 0 +summary_TRIPAVG_battery12v_avg = 0 +summary_TRIPAVG_battery12v_min = 0 +summary_TRIPAVG_battery12v_max = 0 +summary_TRIPAVG_charging_sessions = 0 +summary_TRIPAVG_trip_count = 0 +summary_TRIPAVG_range = 0 +summary_TRIPAVG_address = 0 + +summary_DAYAVG_date = 0 +summary_DAYAVG_info = 0 +summary_DAYAVG_odometer = 0 +summary_DAYAVG_delta_distance = 0 +summary_DAYAVG_kwh_charged = 0 +summary_DAYAVG_kwh_discharged = 0 +summary_DAYAVG_distance_unit_per_kwh = 0 +summary_DAYAVG_kwh_per_100_distance_unit = 0 +summary_DAYAVG_cost = 0 +summary_DAYAVG_soc = 0 +summary_DAYAVG_soc_avg = 0 +summary_DAYAVG_soc_min = 0 +summary_DAYAVG_soc_max = 0 +summary_DAYAVG_battery12v = 0 +summary_DAYAVG_battery12v_avg = 0 +summary_DAYAVG_battery12v_min = 0 +summary_DAYAVG_battery12v_max = 0 +summary_DAYAVG_charging_sessions = 0 +summary_DAYAVG_trip_count = 0 +summary_DAYAVG_range = 0 +summary_DAYAVG_address = 0 + +summary_WEEKAVG_date = 0 +summary_WEEKAVG_info = 0 +summary_WEEKAVG_odometer = 0 +summary_WEEKAVG_delta_distance = 0 +summary_WEEKAVG_kwh_charged = 0 +summary_WEEKAVG_kwh_discharged = 0 +summary_WEEKAVG_distance_unit_per_kwh = 0 +summary_WEEKAVG_kwh_per_100_distance_unit = 0 +summary_WEEKAVG_cost = 0 +summary_WEEKAVG_soc = 0 +summary_WEEKAVG_soc_avg = 0 +summary_WEEKAVG_soc_min = 0 +summary_WEEKAVG_soc_max = 0 +summary_WEEKAVG_battery12v = 0 +summary_WEEKAVG_battery12v_avg = 0 +summary_WEEKAVG_battery12v_min = 0 +summary_WEEKAVG_battery12v_max = 0 +summary_WEEKAVG_charging_sessions = 0 +summary_WEEKAVG_trip_count = 0 +summary_WEEKAVG_range = 0 +summary_WEEKAVG_address = 0 + +summary_MONTHAVG_date = 0 +summary_MONTHAVG_info = 0 +summary_MONTHAVG_odometer = 0 +summary_MONTHAVG_delta_distance = 0 +summary_MONTHAVG_kwh_charged = 0 +summary_MONTHAVG_kwh_discharged = 0 +summary_MONTHAVG_distance_unit_per_kwh = 0 +summary_MONTHAVG_kwh_per_100_distance_unit = 0 +summary_MONTHAVG_cost = 0 +summary_MONTHAVG_soc = 0 +summary_MONTHAVG_soc_avg = 0 +summary_MONTHAVG_soc_min = 0 +summary_MONTHAVG_soc_max = 0 +summary_MONTHAVG_battery12v = 0 +summary_MONTHAVG_battery12v_avg = 0 +summary_MONTHAVG_battery12v_min = 0 +summary_MONTHAVG_battery12v_max = 0 +summary_MONTHAVG_charging_sessions = 0 +summary_MONTHAVG_trip_count = 0 +summary_MONTHAVG_range = 0 +summary_MONTHAVG_address = 0 + +summary_YEARLY_date = 0 +summary_YEARLY_info = 0 +summary_YEARLY_odometer = 0 +summary_YEARLY_delta_distance = 0 +summary_YEARLY_kwh_charged = 0 +summary_YEARLY_kwh_discharged = 0 +summary_YEARLY_distance_unit_per_kwh = 0 +summary_YEARLY_kwh_per_100_distance_unit = 0 +summary_YEARLY_cost = 0 +summary_YEARLY_soc = 0 +summary_YEARLY_soc_avg = 0 +summary_YEARLY_soc_min = 0 +summary_YEARLY_soc_max = 0 +summary_YEARLY_battery12v = 0 +summary_YEARLY_battery12v_avg = 0 +summary_YEARLY_battery12v_min = 0 +summary_YEARLY_battery12v_max = 0 +summary_YEARLY_charging_sessions = 0 +summary_YEARLY_trip_count = 0 +summary_YEARLY_range = 0 +summary_YEARLY_address = 0 + +dailystats_day_TOTALS_date = 0 +dailystats_day_TOTALS_total_consumption = 0 +dailystats_day_TOTALS_regenerated_energy = 0 +dailystats_day_TOTALS_average_consumption = 0 +dailystats_day_TOTALS_engine_consumption = 0 +dailystats_day_TOTALS_climate_consumption = 0 +dailystats_day_TOTALS_onboard_electronics_consumption = 0 +dailystats_day_TOTALS_battery_care_consumption = 0 +dailystats_day_TOTALS_driven = 0 +dailystats_day_TOTALS_regenerated_energy_percentage = 0 +dailystats_day_TOTALS_average_consumption_per_100 = 0 +dailystats_day_TOTALS_engine_consumption_percentage = 0 +dailystats_day_TOTALS_climate_consumption_percentage = 0 +dailystats_day_TOTALS_onboard_electronics_consumption_percentage = 0 +dailystats_day_TOTALS_battery_care_consumption_percentage = 0 + +dailystats_day_LAST_DAY_date = 0 +dailystats_day_LAST_DAY_total_consumption = 0 +dailystats_day_LAST_DAY_regenerated_energy = 0 +dailystats_day_LAST_DAY_average_consumption = 0 +dailystats_day_LAST_DAY_engine_consumption = 0 +dailystats_day_LAST_DAY_climate_consumption = 0 +dailystats_day_LAST_DAY_onboard_electronics_consumption = 0 +dailystats_day_LAST_DAY_battery_care_consumption = 0 +dailystats_day_LAST_DAY_driven = 0 +dailystats_day_LAST_DAY_regenerated_energy_percentage = 0 +dailystats_day_LAST_DAY_average_consumption_per_100 = 0 +dailystats_day_LAST_DAY_engine_consumption_percentage = 0 +dailystats_day_LAST_DAY_climate_consumption_percentage = 0 +dailystats_day_LAST_DAY_onboard_electronics_consumption_percentage = 0 +dailystats_day_LAST_DAY_battery_care_consumption_percentage = 0 + +dailystats_trip_TOTALS_computed_kwh_charged = 0 +dailystats_trip_TOTALS_computed_day_consumption = 0 +dailystats_trip_TOTALS_computed_kwh_used = 0 +dailystats_trip_TOTALS_trip_time = 0 +dailystats_trip_TOTALS_computed_consumption_or_distance = 0 +dailystats_trip_TOTALS_distance = 0 +dailystats_trip_TOTALS_avg_speed = 0 +dailystats_trip_TOTALS_max_speed = 0 +dailystats_trip_TOTALS_idle_time = 0 + +dailystats_trip_LAST_DAY_computed_kwh_charged = 0 +dailystats_trip_LAST_DAY_computed_day_consumption = 0 +dailystats_trip_LAST_DAY_computed_kwh_used = 0 +dailystats_trip_LAST_DAY_trip_time = 0 +dailystats_trip_LAST_DAY_computed_consumption_or_distance = 0 +dailystats_trip_LAST_DAY_distance = 0 +dailystats_trip_LAST_DAY_avg_speed = 0 +dailystats_trip_LAST_DAY_max_speed = 0 +dailystats_trip_LAST_DAY_idle_time = 0 ``` - set send_to_domoticz to True if you want to send updates to *.csv also to Domoticz - domot_url is the URL where to send the updates to -- the next items (e.g. monitor_odometer) you can configure the ID/IDX of each item, If the ID/IDX is 0, that item will NOT be send to Domoticz. +- the next items (e.g. monitor_monitor_odometer) you can configure the ID/IDX of each item, If the ID/IDX is 0, that item will NOT be send to Domoticz. +- the Domoticz configuration lines starting with monitor_ are the configuration items for monitor.py +- the Domoticz configuration lines starting with summary_ are the configuration items for summary.py +- the Domoticz configuration lines starting with dailystats_ are the configuration items for dailystats.py - -*Note: only when there is something added in monitor.csv, monitor.tripinfo.csv and/or monitor.dailystats.csv the corresponding line is splitted and send to MQTT. You can trigger this for testing by e.g. removing the last line of monitor.csv , monitor.tripinfo.csv and/or monitor.dailystats.csv.* +*Note: only when there is something added when running monitor.py (in monitor.csv, monitor.tripinfo.csv and/or monitor.dailystats.csv) the corresponding line is splitted and send to Domoticz. You can trigger this for testing by e.g. removing the last line of monitor.csv , monitor.tripinfo.csv and/or monitor.dailystats.csv. However, summary.py and dailystats.py will always send the latest values to Domoticz.* --- # MQTT Broker (e.g. HomeAssistant, ioBroker) @@ -260,11 +537,19 @@ mqtt_main_topic = hyundai_kia_connect_monitor - mqtt_broker_password is an optional password - mqtt_main_topic is the main topic -When configured, the data is send to mqtt_main_topic/VIN/subtopic. Example screenshot using MQTT Explorer: +When configured, the data is send to mqtt_main_topic/VIN/subtopic. + +*Note: only when there is something added when running monitor.py (in monitor.csv, monitor.tripinfo.csv and/or monitor.dailystats.csv) the corresponding line is splitted and send to MQTT. You can trigger this for testing by e.g. removing the last line of monitor.csv , monitor.tripinfo.csv and/or monitor.dailystats.csv. However, summary.py and dailystats.py will always send the latest values to MQTT.* + + +## MQTT-Explorer screenshot after running monitor.py +![alt text](https://raw.githubusercontent.com/ZuinigeRijder/hyundai_kia_connect_monitor/main/examples/MQTTExplorer_monitor.png) -![alt text](https://raw.githubusercontent.com/ZuinigeRijder/hyundai_kia_connect_monitor/main/examples/MQTTExplorer.png) +## MQTT-Explorer screenshot after running summary.py +![alt text](https://raw.githubusercontent.com/ZuinigeRijder/hyundai_kia_connect_monitor/main/examples/MQTTExplorer_summary.png) -*Note: only when there is something added in monitor.csv, monitor.tripinfo.csv and/or monitor.dailystats.csv the corresponding line is splitted and send to MQTT. You can trigger this for testing by e.g. removing the last line of monitor.csv , monitor.tripinfo.csv and/or monitor.dailystats.csv.* +## MQTT-Explorer screenshot after running dailystats.py: +![alt text](https://raw.githubusercontent.com/ZuinigeRijder/hyundai_kia_connect_monitor/main/examples/MQTTExplorer_dailystats.png) --- # monitor.py @@ -306,40 +591,6 @@ monitor_infinite = False monitor_infinite_interval_minutes = 60 monitor_execute_commands_when_something_written_or_error = -[Domoticz] -send_to_domoticz = False -domot_url = http://192.168.0.222:8081 - -monitor_datetime = 0 -monitor_longitude = 0 -monitor_latitude = 0 -monitor_engineon = 0 -monitor_battery12v = 0 -monitor_odometer = 0 -monitor_soc = 0 -monitor_charging = 0 -monitor_plugged = 0 -monitor_address = 0 -monitor_evrange = 0 - -trip_date = 0 -trip_starttime = 0 -trip_drivetime = 0 -trip_idletime = 0 -trip_distance = 0 -trip_avgspeed = 0 -trip_maxspeed = 0 - -dailystats_date = 0 -dailystats_distance = 0 -dailystats_distance_unit = 0 -dailystats_total_consumed = 0 -dailystats_regenerated_energy = 0 -dailystats_engine_consumption = 0 -dailystats_climate_consumption = 0 -dailystats_onboard_electronics_consumption = 0 -dailystats_battery_care_consumption = 0 - [MQTT] send_to_mqtt = False mqtt_broker_hostname = localhost @@ -347,6 +598,312 @@ mqtt_broker_port = 1883 mqtt_broker_username = mqtt_broker_password = mqtt_main_topic = hyundai_kia_connect_monitor + +[Domoticz] +send_to_domoticz = False +domot_url = http://192.168.0.222:8081 + +monitor_monitor_datetime = 0 +monitor_monitor_longitude = 0 +monitor_monitor_latitude = 0 +monitor_monitor_engineon = 0 +monitor_monitor_battery12v = 0 +monitor_monitor_odometer = 0 +monitor_monitor_soc = 0 +monitor_monitor_charging = 0 +monitor_monitor_plugged = 0 +monitor_monitor_address = 0 +monitor_monitor_evrange = 0 + +monitor_tripinfo_date = 0 +monitor_tripinfo_starttime = 0 +monitor_tripinfo_drivetime = 0 +monitor_tripinfo_idletime = 0 +monitor_tripinfo_distance = 0 +monitor_tripinfo_avgspeed = 0 +monitor_tripinfo_maxspeed = 0 + +monitor_dailystats_date = 0 +monitor_dailystats_distance = 0 +monitor_dailystats_distance_unit = 0 +monitor_dailystats_total_consumed = 0 +monitor_dailystats_regenerated_energy = 0 +monitor_dailystats_engine_consumption = 0 +monitor_dailystats_climate_consumption = 0 +monitor_dailystats_onboard_electronics_consumption = 0 +monitor_dailystats_battery_care_consumption = 0 + +summary_TRIP_date = 0 +summary_TRIP_info = 0 +summary_TRIP_odometer = 0 +summary_TRIP_delta_distance = 0 +summary_TRIP_kwh_charged = 0 +summary_TRIP_kwh_discharged = 0 +summary_TRIP_distance_unit_per_kwh = 0 +summary_TRIP_kwh_per_100_distance_unit = 0 +summary_TRIP_cost = 0 +summary_TRIP_soc = 0 +summary_TRIP_soc_avg = 0 +summary_TRIP_soc_min = 0 +summary_TRIP_soc_max = 0 +summary_TRIP_battery12v = 0 +summary_TRIP_battery12v_avg = 0 +summary_TRIP_battery12v_min = 0 +summary_TRIP_battery12v_max = 0 +summary_TRIP_charging_sessions = 0 +summary_TRIP_trip_count = 0 +summary_TRIP_range = 0 +summary_TRIP_address = 0 + +summary_DAY_date = 0 +summary_DAY_info = 0 +summary_DAY_odometer = 0 +summary_DAY_delta_distance = 0 +summary_DAY_kwh_charged = 0 +summary_DAY_kwh_discharged = 0 +summary_DAY_distance_unit_per_kwh = 0 +summary_DAY_kwh_per_100_distance_unit = 0 +summary_DAY_cost = 0 +summary_DAY_soc = 0 +summary_DAY_soc_avg = 0 +summary_DAY_soc_min = 0 +summary_DAY_soc_max = 0 +summary_DAY_battery12v = 0 +summary_DAY_battery12v_avg = 0 +summary_DAY_battery12v_min = 0 +summary_DAY_battery12v_max = 0 +summary_DAY_charging_sessions = 0 +summary_DAY_trip_count = 0 +summary_DAY_range = 0 +summary_DAY_address = 0 + +summary_WEEK_date = 0 +summary_WEEK_info = 0 +summary_WEEK_odometer = 0 +summary_WEEK_delta_distance = 0 +summary_WEEK_kwh_charged = 0 +summary_WEEK_kwh_discharged = 0 +summary_WEEK_distance_unit_per_kwh = 0 +summary_WEEK_kwh_per_100_distance_unit = 0 +summary_WEEK_cost = 0 +summary_WEEK_soc = 0 +summary_WEEK_soc_avg = 0 +summary_WEEK_soc_min = 0 +summary_WEEK_soc_max = 0 +summary_WEEK_battery12v = 0 +summary_WEEK_battery12v_avg = 0 +summary_WEEK_battery12v_min = 0 +summary_WEEK_battery12v_max = 0 +summary_WEEK_charging_sessions = 0 +summary_WEEK_trip_count = 0 +summary_WEEK_range = 0 +summary_WEEK_address = 0 + +summary_MONTH_date = 0 +summary_MONTH_info = 0 +summary_MONTH_odometer = 0 +summary_MONTH_delta_distance = 0 +summary_MONTH_kwh_charged = 0 +summary_MONTH_kwh_discharged = 0 +summary_MONTH_distance_unit_per_kwh = 0 +summary_MONTH_kwh_per_100_distance_unit = 0 +summary_MONTH_cost = 0 +summary_MONTH_soc = 0 +summary_MONTH_soc_avg = 0 +summary_MONTH_soc_min = 0 +summary_MONTH_soc_max = 0 +summary_MONTH_battery12v = 0 +summary_MONTH_battery12v_avg = 0 +summary_MONTH_battery12v_min = 0 +summary_MONTH_battery12v_max = 0 +summary_MONTH_charging_sessions = 0 +summary_MONTH_trip_count = 0 +summary_MONTH_range = 0 +summary_MONTH_address = 0 + +summary_YEAR_date = 0 +summary_YEAR_info = 0 +summary_YEAR_odometer = 0 +summary_YEAR_delta_distance = 0 +summary_YEAR_kwh_charged = 0 +summary_YEAR_kwh_discharged = 0 +summary_YEAR_distance_unit_per_kwh = 0 +summary_YEAR_kwh_per_100_distance_unit = 0 +summary_YEAR_cost = 0 +summary_YEAR_soc = 0 +summary_YEAR_soc_avg = 0 +summary_YEAR_soc_min = 0 +summary_YEAR_soc_max = 0 +summary_YEAR_battery12v = 0 +summary_YEAR_battery12v_avg = 0 +summary_YEAR_battery12v_min = 0 +summary_YEAR_battery12v_max = 0 +summary_YEAR_charging_sessions = 0 +summary_YEAR_trip_count = 0 +summary_YEAR_range = 0 +summary_YEAR_address = 0 + +summary_TRIPAVG_date = 0 +summary_TRIPAVG_info = 0 +summary_TRIPAVG_odometer = 0 +summary_TRIPAVG_delta_distance = 0 +summary_TRIPAVG_kwh_charged = 0 +summary_TRIPAVG_kwh_discharged = 0 +summary_TRIPAVG_distance_unit_per_kwh = 0 +summary_TRIPAVG_kwh_per_100_distance_unit = 0 +summary_TRIPAVG_cost = 0 +summary_TRIPAVG_soc = 0 +summary_TRIPAVG_soc_avg = 0 +summary_TRIPAVG_soc_min = 0 +summary_TRIPAVG_soc_max = 0 +summary_TRIPAVG_battery12v = 0 +summary_TRIPAVG_battery12v_avg = 0 +summary_TRIPAVG_battery12v_min = 0 +summary_TRIPAVG_battery12v_max = 0 +summary_TRIPAVG_charging_sessions = 0 +summary_TRIPAVG_trip_count = 0 +summary_TRIPAVG_range = 0 +summary_TRIPAVG_address = 0 + +summary_DAYAVG_date = 0 +summary_DAYAVG_info = 0 +summary_DAYAVG_odometer = 0 +summary_DAYAVG_delta_distance = 0 +summary_DAYAVG_kwh_charged = 0 +summary_DAYAVG_kwh_discharged = 0 +summary_DAYAVG_distance_unit_per_kwh = 0 +summary_DAYAVG_kwh_per_100_distance_unit = 0 +summary_DAYAVG_cost = 0 +summary_DAYAVG_soc = 0 +summary_DAYAVG_soc_avg = 0 +summary_DAYAVG_soc_min = 0 +summary_DAYAVG_soc_max = 0 +summary_DAYAVG_battery12v = 0 +summary_DAYAVG_battery12v_avg = 0 +summary_DAYAVG_battery12v_min = 0 +summary_DAYAVG_battery12v_max = 0 +summary_DAYAVG_charging_sessions = 0 +summary_DAYAVG_trip_count = 0 +summary_DAYAVG_range = 0 +summary_DAYAVG_address = 0 + +summary_WEEKAVG_date = 0 +summary_WEEKAVG_info = 0 +summary_WEEKAVG_odometer = 0 +summary_WEEKAVG_delta_distance = 0 +summary_WEEKAVG_kwh_charged = 0 +summary_WEEKAVG_kwh_discharged = 0 +summary_WEEKAVG_distance_unit_per_kwh = 0 +summary_WEEKAVG_kwh_per_100_distance_unit = 0 +summary_WEEKAVG_cost = 0 +summary_WEEKAVG_soc = 0 +summary_WEEKAVG_soc_avg = 0 +summary_WEEKAVG_soc_min = 0 +summary_WEEKAVG_soc_max = 0 +summary_WEEKAVG_battery12v = 0 +summary_WEEKAVG_battery12v_avg = 0 +summary_WEEKAVG_battery12v_min = 0 +summary_WEEKAVG_battery12v_max = 0 +summary_WEEKAVG_charging_sessions = 0 +summary_WEEKAVG_trip_count = 0 +summary_WEEKAVG_range = 0 +summary_WEEKAVG_address = 0 + +summary_MONTHAVG_date = 0 +summary_MONTHAVG_info = 0 +summary_MONTHAVG_odometer = 0 +summary_MONTHAVG_delta_distance = 0 +summary_MONTHAVG_kwh_charged = 0 +summary_MONTHAVG_kwh_discharged = 0 +summary_MONTHAVG_distance_unit_per_kwh = 0 +summary_MONTHAVG_kwh_per_100_distance_unit = 0 +summary_MONTHAVG_cost = 0 +summary_MONTHAVG_soc = 0 +summary_MONTHAVG_soc_avg = 0 +summary_MONTHAVG_soc_min = 0 +summary_MONTHAVG_soc_max = 0 +summary_MONTHAVG_battery12v = 0 +summary_MONTHAVG_battery12v_avg = 0 +summary_MONTHAVG_battery12v_min = 0 +summary_MONTHAVG_battery12v_max = 0 +summary_MONTHAVG_charging_sessions = 0 +summary_MONTHAVG_trip_count = 0 +summary_MONTHAVG_range = 0 +summary_MONTHAVG_address = 0 + +summary_YEARLY_date = 0 +summary_YEARLY_info = 0 +summary_YEARLY_odometer = 0 +summary_YEARLY_delta_distance = 0 +summary_YEARLY_kwh_charged = 0 +summary_YEARLY_kwh_discharged = 0 +summary_YEARLY_distance_unit_per_kwh = 0 +summary_YEARLY_kwh_per_100_distance_unit = 0 +summary_YEARLY_cost = 0 +summary_YEARLY_soc = 0 +summary_YEARLY_soc_avg = 0 +summary_YEARLY_soc_min = 0 +summary_YEARLY_soc_max = 0 +summary_YEARLY_battery12v = 0 +summary_YEARLY_battery12v_avg = 0 +summary_YEARLY_battery12v_min = 0 +summary_YEARLY_battery12v_max = 0 +summary_YEARLY_charging_sessions = 0 +summary_YEARLY_trip_count = 0 +summary_YEARLY_range = 0 +summary_YEARLY_address = 0 + +dailystats_day_TOTALS_date = 0 +dailystats_day_TOTALS_total_consumption = 0 +dailystats_day_TOTALS_regenerated_energy = 0 +dailystats_day_TOTALS_average_consumption = 0 +dailystats_day_TOTALS_engine_consumption = 0 +dailystats_day_TOTALS_climate_consumption = 0 +dailystats_day_TOTALS_onboard_electronics_consumption = 0 +dailystats_day_TOTALS_battery_care_consumption = 0 +dailystats_day_TOTALS_driven = 0 +dailystats_day_TOTALS_regenerated_energy_percentage = 0 +dailystats_day_TOTALS_average_consumption_per_100 = 0 +dailystats_day_TOTALS_engine_consumption_percentage = 0 +dailystats_day_TOTALS_climate_consumption_percentage = 0 +dailystats_day_TOTALS_onboard_electronics_consumption_percentage = 0 +dailystats_day_TOTALS_battery_care_consumption_percentage = 0 + +dailystats_day_LAST_DAY_date = 0 +dailystats_day_LAST_DAY_total_consumption = 0 +dailystats_day_LAST_DAY_regenerated_energy = 0 +dailystats_day_LAST_DAY_average_consumption = 0 +dailystats_day_LAST_DAY_engine_consumption = 0 +dailystats_day_LAST_DAY_climate_consumption = 0 +dailystats_day_LAST_DAY_onboard_electronics_consumption = 0 +dailystats_day_LAST_DAY_battery_care_consumption = 0 +dailystats_day_LAST_DAY_driven = 0 +dailystats_day_LAST_DAY_regenerated_energy_percentage = 0 +dailystats_day_LAST_DAY_average_consumption_per_100 = 0 +dailystats_day_LAST_DAY_engine_consumption_percentage = 0 +dailystats_day_LAST_DAY_climate_consumption_percentage = 0 +dailystats_day_LAST_DAY_onboard_electronics_consumption_percentage = 0 +dailystats_day_LAST_DAY_battery_care_consumption_percentage = 0 + +dailystats_trip_TOTALS_computed_kwh_charged = 0 +dailystats_trip_TOTALS_computed_day_consumption = 0 +dailystats_trip_TOTALS_computed_kwh_used = 0 +dailystats_trip_TOTALS_trip_time = 0 +dailystats_trip_TOTALS_computed_consumption_or_distance = 0 +dailystats_trip_TOTALS_distance = 0 +dailystats_trip_TOTALS_avg_speed = 0 +dailystats_trip_TOTALS_max_speed = 0 +dailystats_trip_TOTALS_idle_time = 0 + +dailystats_trip_LAST_DAY_computed_kwh_charged = 0 +dailystats_trip_LAST_DAY_computed_day_consumption = 0 +dailystats_trip_LAST_DAY_computed_kwh_used = 0 +dailystats_trip_LAST_DAY_trip_time = 0 +dailystats_trip_LAST_DAY_computed_consumption_or_distance = 0 +dailystats_trip_LAST_DAY_distance = 0 +dailystats_trip_LAST_DAY_avg_speed = 0 +dailystats_trip_LAST_DAY_max_speed = 0 +dailystats_trip_LAST_DAY_idle_time = 0 ``` Explanation of the configuration items: @@ -373,7 +930,9 @@ Explanation of the configuration items: *Note 2: I think that the consumption values ​​of the on-board computer are corrected with an efficiency number, e.g. 1 kWh of energy results in 0.9 kWh of real energy (losses when converting battery kWh by the car). So therefor I introduced an efficiency configuration factor in monitor.cfg, consumption_efficiency_factor_dailystats and consumption_efficiency_factor_summary. For example, when setting this to 0.9, 10% of the energy is lost during the conversion and is used in the consumption calculation. Default the values are 1.0, so no correction.* -*Note 3: language is only implemented for Europe currently.* +*Note 3: The last TRIP, DAY, WEEK, MONTH, YEAR, TRIPAVG, DAYAVG, WEEKAVG, MONTHAVG, YEARLY lines are also send to [Domoticz](#domoticz) and/or [MQTT Broker](#mqtt-broker-eg-homeassistant-iobroker) (e.g. HomeAssistant, ioBroker) when configured.* + +*Note 4: language is only implemented for Europe currently.* [For a list of language codes, see here.](https://www.science.co.il/language/Codes.php). Currently in Europe the Bluelink App shows the following languages: - "en" English @@ -529,6 +1088,8 @@ Explanation of configuration items: - ignore_small_negative_delta_soc, do not see this as discharge% when not moved, because with temperature changes the percentage can decrease - show_zero_values = True shows also zero values in the standard output, can be easier for spreadsheets, but more difficult to read +*Note: The dailystats DAY totals, TRIP Totals and last DAY and TRIP lines are also send to [Domoticz](#domoticz) and/or [MQTT Broker](#mqtt-broker-eg-homeassistant-iobroker) (e.g. HomeAssistant, ioBroker) when configured.* + --- # summary.py sheetupdate make summary per TRIP, DAY, WEEK, MONTH, YEAR with monitor.csv as input and write summary to Google Spreadsheet diff --git a/check_monitor.py b/check_monitor.py index bd69645..6bb7f13 100644 --- a/check_monitor.py +++ b/check_monitor.py @@ -1,20 +1,19 @@ # == check_monitor.py Author: Zuinige Rijder ========= """ Simple Python3 script to check monitor.csv """ +from os import path from datetime import datetime from io import TextIOWrapper +import logging +import logging.config from pathlib import Path -from monitor_utils import arg_has, split_on_comma +from monitor_utils import arg_has, dbg, set_dbg, split_on_comma +SCRIPT_DIRNAME = path.abspath(path.dirname(__file__)) +logging.config.fileConfig(f"{SCRIPT_DIRNAME}/logging_config.ini") D = arg_has("debug") - - -def dbg(line: str) -> bool: - """print line if debugging""" - if D: - print(line) - return D # just to make a lazy evaluation expression possible - +if D: + set_dbg() # indexes to splitted monitor.csv items DT = 0 # datetime diff --git a/dailystats.py b/dailystats.py index 819d3eb..748aec0 100644 --- a/dailystats.py +++ b/dailystats.py @@ -17,13 +17,21 @@ import typing from dateutil.relativedelta import relativedelta import gspread +from domoticz_utils import ( + SEND_TO_DOMOTICZ, + send_dailystats_day_line_to_domoticz, + send_dailystats_trip_line_to_domoticz, +) from monitor_utils import ( + dbg, + determine_vin, float_to_string_no_trailing_zero, get, get_filepath, arg_has, get_vin_arg, safe_divide, + set_dbg, sleep_a_minute, split_on_comma, split_output_to_sheet_float_list, @@ -36,25 +44,23 @@ read_reverse_order_init, split_output_to_sheet_list, ) +from mqtt_utils import ( + SEND_TO_MQTT, + send_dailystats_day_line_to_mqtt, + send_dailystats_trip_line_to_mqtt, + stop_mqtt, +) SCRIPT_DIRNAME = path.abspath(path.dirname(__file__)) logging.config.fileConfig(f"{SCRIPT_DIRNAME}/logging_config.ini") D = arg_has("debug") if D: - logging.getLogger().setLevel(logging.DEBUG) + set_dbg() # Initializing a queue for about 30 days MAX_QUEUE_LEN = 122 PRINTED_OUTPUT_QUEUE: deque[str] = deque(maxlen=MAX_QUEUE_LEN) - -def dbg(line: str) -> bool: - """print line if debugging""" - if D: - logging.debug(line) - return D # just to make a lazy evaluation expression possible - - KEYWORD_LIST = ["help", "sheetupdate", "debug"] KEYWORD_ERROR = False for kindex in range(1, len(sys.argv)): @@ -74,6 +80,7 @@ def dbg(line: str) -> bool: OUTPUT_SPREADSHEET_NAME = "monitor.dailystats" SHEET: typing.Any = None +LASTRUN_FILENAME = Path("monitor.lastrun") DAILYSTATS_CSV_FILE = Path("monitor.dailystats.csv") TRIPINFO_CSV_FILE = Path("monitor.tripinfo.csv") SUMMARY_CHARGE_CSV_FILE = Path("summary.charge.csv") @@ -82,6 +89,7 @@ def dbg(line: str) -> bool: LENCHECK = 1 VIN = get_vin_arg() if VIN != "": + LASTRUN_FILENAME = Path(f"monitor.{VIN}.lastrun") DAILYSTATS_CSV_FILE = Path(f"monitor.dailystats.{VIN}.csv") TRIPINFO_CSV_FILE = Path(f"monitor.tripinfo.{VIN}.csv") SUMMARY_CHARGE_CSV_FILE = Path(f"summary.charge.{VIN}.csv") @@ -118,6 +126,7 @@ def dbg(line: str) -> bool: TR_HELPER: dict[str, str] = read_translations() COLUMN_WIDTHS = [11, 12, 14, 10, 9, 9, 8] +EMPTY_ROW = ",,,,,," def update_width(text: str, index_column_widths: int) -> None: @@ -320,8 +329,9 @@ def print_output(output: str) -> None: print(text, end="") print("") - if SHEETUPDATE and len(PRINTED_OUTPUT_QUEUE) < MAX_QUEUE_LEN: - PRINTED_OUTPUT_QUEUE.append(output) + if SHEETUPDATE or SEND_TO_DOMOTICZ or SEND_TO_MQTT: + if len(PRINTED_OUTPUT_QUEUE) < MAX_QUEUE_LEN: + PRINTED_OUTPUT_QUEUE.append(output) def get_charge_for_date(date: str) -> str: @@ -580,7 +590,7 @@ def print_dailystats( time_str = now.strftime("%H:%M") tr_last_run = get_translation_and_update_width("Last run", 0) print_output(f"{tr_last_run},{date_str},{time_str},{tr_weekday},,,") - print_output(",,,,,,") # empty line/row + print_output(EMPTY_ROW) print_output( f"{totals},{TR.recuperation},{TR.consumption},{TR.engine},{TR.climate},{TR.electronic_devices},{TR.battery_care}" # noqa @@ -674,7 +684,7 @@ def summary_tripinfo() -> None: avg_speed=f"{average_speed}", max_speed=f"{TOTAL_TRIPINFO_MAX_SPEED}", ) - print_output(",,,,,,") # empty line/row + print_output(EMPTY_ROW) def reverse_print_dailystats_one_line(val: list[str]) -> None: @@ -694,7 +704,7 @@ def reverse_print_dailystats_one_line(val: list[str]) -> None: ) if date != "Totals": print_day_trip_info(date) - print_output(",,,,,,") # empty line/row + print_output(EMPTY_ROW) def compute_cumulative_dailystats(val: list[str], total: list[str]) -> list[str]: @@ -824,7 +834,7 @@ def print_output_queue() -> None: array.append({"range": f"N{cd_row}", "values": [[cd_date]]}) cd_date = "" else: - if ct_header and queue_output != ",,,,,,": + if ct_header and queue_output != EMPTY_ROW: # tripinfo trip = [ct_date, 0, "", 0, 0, 0, 0] # clear consumption tmp = re.sub(r"[^0-9.,:-]", "", queue_output) @@ -864,6 +874,45 @@ def print_output_queue() -> None: SHEET.batch_format(formats) +def send_to_mqtt_domoticz() -> None: + """send_to_mqtt_domoticz""" + idx = 0 + items = [] + for item in PRINTED_OUTPUT_QUEUE: + idx += 1 + _ = D and dbg(f"{idx}: {item}") + items.append(item) + if idx > 13 and item == EMPTY_ROW: # no more trips + break + + # send dailystats day info + totals_day = f"{items[0].split(',')[1]},{items[3]},{items[4]}" + last_day = f"{items[8].split(',')[0]},{items[9]},{items[10]}" + + if SEND_TO_MQTT: + determine_vin(LASTRUN_FILENAME) + send_dailystats_day_line_to_mqtt("TOTALS", totals_day) + send_dailystats_day_line_to_mqtt("LAST_DAY", last_day) + + if SEND_TO_DOMOTICZ: + send_dailystats_day_line_to_domoticz("TOTALS", totals_day) + send_dailystats_day_line_to_domoticz("LAST_DAY", last_day) + + # send also the dailystats_trip info + totals_trip = f"{items[5].split(',')[0]},{items[5].split(',')[2]}, {items[6]}" + last_trip = f"{items[11].split(',')[0]},{items[11].split(',')[2]}, {items[12]}" + + if SEND_TO_MQTT: + send_dailystats_trip_line_to_mqtt("TOTALS", totals_trip) + send_dailystats_trip_line_to_mqtt("LAST_DAY", last_trip) + + if SEND_TO_DOMOTICZ: + send_dailystats_trip_line_to_domoticz("TOTALS", totals_trip) + send_dailystats_trip_line_to_domoticz("LAST_DAY", last_trip) + + stop_mqtt() + + # main program RETRIES = -1 if SHEETUPDATE: @@ -910,6 +959,9 @@ def print_output_queue() -> None: traceback.print_exc() RETRIES = sleep_a_minute(RETRIES) +if SEND_TO_DOMOTICZ or SEND_TO_MQTT: + send_to_mqtt_domoticz() + if RETRIES == -1: - exit(0) -exit(-1) + sys.exit(0) +sys.exit(-1) diff --git a/domoticz_utils.py b/domoticz_utils.py index efb986c..08bb8c8 100644 --- a/domoticz_utils.py +++ b/domoticz_utils.py @@ -7,13 +7,18 @@ import logging.config from monitor_utils import ( + dbg, execute_request, get, + d, get_bool, get_filepath, + get_items_dailystat_trip, + get_items_dailystats_day, get_items_monitor_csv, get_items_monitor_dailystats_csv, get_items_monitor_tripinfo_csv, + get_items_summary, ) PARSER = configparser.ConfigParser() @@ -25,15 +30,30 @@ DOMOTICZ_URL = get(domoticz_settings, "domot_url") ITEMS_MONITOR_CSV = get_items_monitor_csv() -ITEMS_MONITOR_TRIPINFO_CSV = get_items_monitor_tripinfo_csv() -ITEMS_MONITOR_DAILYSTATS_CSV = get_items_monitor_dailystats_csv() +for IDX in range(len(ITEMS_MONITOR_CSV)): # pylint:disable=consider-using-enumerate + ITEMS_MONITOR_CSV[IDX] = f"monitor_monitor_{ITEMS_MONITOR_CSV[IDX]}" + +ITEMS_TRIPINFO_CSV = get_items_monitor_tripinfo_csv() +for IDX in range(len(ITEMS_TRIPINFO_CSV)): # pylint:disable=consider-using-enumerate + ITEMS_TRIPINFO_CSV[IDX] = f"monitor_tripinfo_{ITEMS_TRIPINFO_CSV[IDX]}" + +ITEMS_DAILYSTATS_CSV = get_items_monitor_dailystats_csv() +for IDX in range(len(ITEMS_DAILYSTATS_CSV)): # pylint:disable=consider-using-enumerate + ITEMS_DAILYSTATS_CSV[IDX] = f"monitor_dailystats_{ITEMS_DAILYSTATS_CSV[IDX]}" + +ITEMS_SUMMARY = get_items_summary() + +ITEMS_DAILYSTATS_DAY = get_items_dailystats_day() + +ITEMS_DAILYSTATS_TRIP = get_items_dailystat_trip() # == send to Domoticz ======================================================== def send_to_domoticz(header: str, value: str) -> None: """send_to_Domoticz""" + reference_test = DOMOTICZ_URL == "domoticz_reference_test" idx = get(domoticz_settings, header, "0") - if idx == "0": + if idx == "0" and not reference_test: return # nothing to do url = ( @@ -43,9 +63,12 @@ def send_to_domoticz(header: str, value: str) -> None: + "&svalue=" + value ) - logging.debug(url) + if reference_test: + _ = d() and dbg(f"send_to_domoticz: {header} = {value}") + else: + _ = d() and dbg(url) retry = 0 - while True: + while not reference_test: retry += 1 content = execute_request(url, "", {}) if content != "ERROR" or retry > 30: @@ -54,15 +77,34 @@ def send_to_domoticz(header: str, value: str) -> None: return -def send_line(headers: list, line: str) -> None: - """send_line""" - splitted = line.split(",") +def send_splitted_line( + headers: list, splitted: list, replace_empty_by_0: bool, skip_first: bool +) -> None: + """send_splitted_line""" if len(splitted) < len(headers): - logging.info(f"line does not have all elements: {line}\n{headers}") + logging.warning( + f"line does not have all elements: {splitted}\nHEADERS={headers}" + ) return + skipped_first = not skip_first for i in range(len(splitted)): # pylint:disable=consider-using-enumerate - send_to_domoticz(headers[i], splitted[i].strip()) + if i < len(headers): + if skipped_first: + value = splitted[i].strip() + if replace_empty_by_0 and value == "": + value = "0" + send_to_domoticz(headers[i], value) + else: + skipped_first = True + + +def send_line( + headers: list, line: str, replace_empty_by_0: bool = True, skip_first: bool = False +) -> None: + """send_line""" + splitted = line.split(",") + send_splitted_line(headers, splitted, replace_empty_by_0, skip_first) def send_monitor_csv_line_to_domoticz(line: str) -> None: @@ -71,13 +113,52 @@ def send_monitor_csv_line_to_domoticz(line: str) -> None: send_line(ITEMS_MONITOR_CSV, line) -def send_tripinfo_line_to_domoticz(line: str) -> None: - """send_tripinfo_line_to_domoticz""" +def send_tripinfo_csv_line_to_domoticz(line: str) -> None: + """send_tripinfo_csv_line_to_domoticz""" + if SEND_TO_DOMOTICZ: + send_line(ITEMS_TRIPINFO_CSV, line) + + +def send_dailystats_csv_line_to_domoticz(line: str) -> None: + """send_dailystats_csv_line_to_domoticz""" + if SEND_TO_DOMOTICZ: + send_line(ITEMS_DAILYSTATS_CSV, line) + + +def get_items(subtopic: str, items: list[str]) -> list[str]: + """get_items""" + new_items: list[str] = [] + for item in items: + new_items.append(f"{subtopic}_{item}") + return new_items + + +def send_summary_line_to_domoticz(line: str) -> None: + """send_summary_line_to_domoticz""" + if SEND_TO_DOMOTICZ: + splitted = [x.strip() for x in line.split(",")] + period = splitted[0].replace(" ", "") + if ( + period + in "TRIP, DAY, WEEK, MONTH, YEAR, TRIPAVG, DAYAVG, WEEKAVG, MONTHAVG, YEARLY" # noqa + ): + send_splitted_line( + get_items(f"summary_{period}", ITEMS_SUMMARY), splitted, True, True + ) + + +def send_dailystats_day_line_to_domoticz(postfix: str, line: str) -> None: + """send_dailystats_day_line_to_domoticz""" if SEND_TO_DOMOTICZ: - send_line(ITEMS_MONITOR_TRIPINFO_CSV, line) + send_line(get_items(f"dailystats_day_{postfix}", ITEMS_DAILYSTATS_DAY), line) -def send_dailystats_line_to_domoticz(line: str) -> None: - """send_dailystats_line_to_domoticz""" +def send_dailystats_trip_line_to_domoticz( + postfix: str, line: str, skip_first_two: bool = False +) -> None: + """send_dailystats_trip_line_to_domoticz""" if SEND_TO_DOMOTICZ: - send_line(ITEMS_MONITOR_DAILYSTATS_CSV, line) + items = get_items(f"dailystats_trip_{postfix}", ITEMS_DAILYSTATS_TRIP) + if skip_first_two: + items = items[2:] + send_line(items, line, replace_empty_by_0=False) diff --git a/examples/MQTTExplorer.png b/examples/MQTTExplorer.png deleted file mode 100644 index cd784c0..0000000 Binary files a/examples/MQTTExplorer.png and /dev/null differ diff --git a/examples/MQTTExplorer_dailystats.png b/examples/MQTTExplorer_dailystats.png new file mode 100644 index 0000000..65f201e Binary files /dev/null and b/examples/MQTTExplorer_dailystats.png differ diff --git a/examples/MQTTExplorer_monitor.png b/examples/MQTTExplorer_monitor.png new file mode 100644 index 0000000..f9f5b23 Binary files /dev/null and b/examples/MQTTExplorer_monitor.png differ diff --git a/examples/MQTTExplorer_summary.png b/examples/MQTTExplorer_summary.png new file mode 100644 index 0000000..6edf2a2 Binary files /dev/null and b/examples/MQTTExplorer_summary.png differ diff --git a/monitor.cfg b/monitor.cfg index 0413f72..8e394be 100644 --- a/monitor.cfg +++ b/monitor.cfg @@ -15,40 +15,6 @@ monitor_infinite = False monitor_infinite_interval_minutes = 60 monitor_execute_commands_when_something_written_or_error = -[Domoticz] -send_to_domoticz = False -domot_url = http://192.168.0.222:8081 - -monitor_datetime = 0 -monitor_longitude = 0 -monitor_latitude = 0 -monitor_engineon = 0 -monitor_battery12v = 0 -monitor_odometer = 0 -monitor_soc = 0 -monitor_charging = 0 -monitor_plugged = 0 -monitor_address = 0 -monitor_evrange = 0 - -trip_date = 0 -trip_starttime = 0 -trip_drivetime = 0 -trip_idletime = 0 -trip_distance = 0 -trip_avgspeed = 0 -trip_maxspeed = 0 - -dailystats_date = 0 -dailystats_distance = 0 -dailystats_distance_unit = 0 -dailystats_total_consumed = 0 -dailystats_regenerated_energy = 0 -dailystats_engine_consumption = 0 -dailystats_climate_consumption = 0 -dailystats_onboard_electronics_consumption = 0 -dailystats_battery_care_consumption = 0 - [MQTT] send_to_mqtt = False mqtt_broker_hostname = localhost @@ -56,3 +22,309 @@ mqtt_broker_port = 1883 mqtt_broker_username = mqtt_broker_password = mqtt_main_topic = hyundai_kia_connect_monitor + +[Domoticz] +send_to_domoticz = False +domot_url = http://192.168.0.222:8081 + +monitor_monitor_datetime = 0 +monitor_monitor_longitude = 0 +monitor_monitor_latitude = 0 +monitor_monitor_engineon = 0 +monitor_monitor_battery12v = 0 +monitor_monitor_odometer = 0 +monitor_monitor_soc = 0 +monitor_monitor_charging = 0 +monitor_monitor_plugged = 0 +monitor_monitor_address = 0 +monitor_monitor_evrange = 0 + +monitor_tripinfo_date = 0 +monitor_tripinfo_starttime = 0 +monitor_tripinfo_drivetime = 0 +monitor_tripinfo_idletime = 0 +monitor_tripinfo_distance = 0 +monitor_tripinfo_avgspeed = 0 +monitor_tripinfo_maxspeed = 0 + +monitor_dailystats_date = 0 +monitor_dailystats_distance = 0 +monitor_dailystats_distance_unit = 0 +monitor_dailystats_total_consumed = 0 +monitor_dailystats_regenerated_energy = 0 +monitor_dailystats_engine_consumption = 0 +monitor_dailystats_climate_consumption = 0 +monitor_dailystats_onboard_electronics_consumption = 0 +monitor_dailystats_battery_care_consumption = 0 + +summary_TRIP_date = 0 +summary_TRIP_info = 0 +summary_TRIP_odometer = 0 +summary_TRIP_delta_distance = 0 +summary_TRIP_kwh_charged = 0 +summary_TRIP_kwh_discharged = 0 +summary_TRIP_distance_unit_per_kwh = 0 +summary_TRIP_kwh_per_100_distance_unit = 0 +summary_TRIP_cost = 0 +summary_TRIP_soc = 0 +summary_TRIP_soc_avg = 0 +summary_TRIP_soc_min = 0 +summary_TRIP_soc_max = 0 +summary_TRIP_battery12v = 0 +summary_TRIP_battery12v_avg = 0 +summary_TRIP_battery12v_min = 0 +summary_TRIP_battery12v_max = 0 +summary_TRIP_charging_sessions = 0 +summary_TRIP_trip_count = 0 +summary_TRIP_range = 0 +summary_TRIP_address = 0 + +summary_DAY_date = 0 +summary_DAY_info = 0 +summary_DAY_odometer = 0 +summary_DAY_delta_distance = 0 +summary_DAY_kwh_charged = 0 +summary_DAY_kwh_discharged = 0 +summary_DAY_distance_unit_per_kwh = 0 +summary_DAY_kwh_per_100_distance_unit = 0 +summary_DAY_cost = 0 +summary_DAY_soc = 0 +summary_DAY_soc_avg = 0 +summary_DAY_soc_min = 0 +summary_DAY_soc_max = 0 +summary_DAY_battery12v = 0 +summary_DAY_battery12v_avg = 0 +summary_DAY_battery12v_min = 0 +summary_DAY_battery12v_max = 0 +summary_DAY_charging_sessions = 0 +summary_DAY_trip_count = 0 +summary_DAY_range = 0 +summary_DAY_address = 0 + +summary_WEEK_date = 0 +summary_WEEK_info = 0 +summary_WEEK_odometer = 0 +summary_WEEK_delta_distance = 0 +summary_WEEK_kwh_charged = 0 +summary_WEEK_kwh_discharged = 0 +summary_WEEK_distance_unit_per_kwh = 0 +summary_WEEK_kwh_per_100_distance_unit = 0 +summary_WEEK_cost = 0 +summary_WEEK_soc = 0 +summary_WEEK_soc_avg = 0 +summary_WEEK_soc_min = 0 +summary_WEEK_soc_max = 0 +summary_WEEK_battery12v = 0 +summary_WEEK_battery12v_avg = 0 +summary_WEEK_battery12v_min = 0 +summary_WEEK_battery12v_max = 0 +summary_WEEK_charging_sessions = 0 +summary_WEEK_trip_count = 0 +summary_WEEK_range = 0 +summary_WEEK_address = 0 + +summary_MONTH_date = 0 +summary_MONTH_info = 0 +summary_MONTH_odometer = 0 +summary_MONTH_delta_distance = 0 +summary_MONTH_kwh_charged = 0 +summary_MONTH_kwh_discharged = 0 +summary_MONTH_distance_unit_per_kwh = 0 +summary_MONTH_kwh_per_100_distance_unit = 0 +summary_MONTH_cost = 0 +summary_MONTH_soc = 0 +summary_MONTH_soc_avg = 0 +summary_MONTH_soc_min = 0 +summary_MONTH_soc_max = 0 +summary_MONTH_battery12v = 0 +summary_MONTH_battery12v_avg = 0 +summary_MONTH_battery12v_min = 0 +summary_MONTH_battery12v_max = 0 +summary_MONTH_charging_sessions = 0 +summary_MONTH_trip_count = 0 +summary_MONTH_range = 0 +summary_MONTH_address = 0 + +summary_YEAR_date = 0 +summary_YEAR_info = 0 +summary_YEAR_odometer = 0 +summary_YEAR_delta_distance = 0 +summary_YEAR_kwh_charged = 0 +summary_YEAR_kwh_discharged = 0 +summary_YEAR_distance_unit_per_kwh = 0 +summary_YEAR_kwh_per_100_distance_unit = 0 +summary_YEAR_cost = 0 +summary_YEAR_soc = 0 +summary_YEAR_soc_avg = 0 +summary_YEAR_soc_min = 0 +summary_YEAR_soc_max = 0 +summary_YEAR_battery12v = 0 +summary_YEAR_battery12v_avg = 0 +summary_YEAR_battery12v_min = 0 +summary_YEAR_battery12v_max = 0 +summary_YEAR_charging_sessions = 0 +summary_YEAR_trip_count = 0 +summary_YEAR_range = 0 +summary_YEAR_address = 0 + +summary_TRIPAVG_date = 0 +summary_TRIPAVG_info = 0 +summary_TRIPAVG_odometer = 0 +summary_TRIPAVG_delta_distance = 0 +summary_TRIPAVG_kwh_charged = 0 +summary_TRIPAVG_kwh_discharged = 0 +summary_TRIPAVG_distance_unit_per_kwh = 0 +summary_TRIPAVG_kwh_per_100_distance_unit = 0 +summary_TRIPAVG_cost = 0 +summary_TRIPAVG_soc = 0 +summary_TRIPAVG_soc_avg = 0 +summary_TRIPAVG_soc_min = 0 +summary_TRIPAVG_soc_max = 0 +summary_TRIPAVG_battery12v = 0 +summary_TRIPAVG_battery12v_avg = 0 +summary_TRIPAVG_battery12v_min = 0 +summary_TRIPAVG_battery12v_max = 0 +summary_TRIPAVG_charging_sessions = 0 +summary_TRIPAVG_trip_count = 0 +summary_TRIPAVG_range = 0 +summary_TRIPAVG_address = 0 + +summary_DAYAVG_date = 0 +summary_DAYAVG_info = 0 +summary_DAYAVG_odometer = 0 +summary_DAYAVG_delta_distance = 0 +summary_DAYAVG_kwh_charged = 0 +summary_DAYAVG_kwh_discharged = 0 +summary_DAYAVG_distance_unit_per_kwh = 0 +summary_DAYAVG_kwh_per_100_distance_unit = 0 +summary_DAYAVG_cost = 0 +summary_DAYAVG_soc = 0 +summary_DAYAVG_soc_avg = 0 +summary_DAYAVG_soc_min = 0 +summary_DAYAVG_soc_max = 0 +summary_DAYAVG_battery12v = 0 +summary_DAYAVG_battery12v_avg = 0 +summary_DAYAVG_battery12v_min = 0 +summary_DAYAVG_battery12v_max = 0 +summary_DAYAVG_charging_sessions = 0 +summary_DAYAVG_trip_count = 0 +summary_DAYAVG_range = 0 +summary_DAYAVG_address = 0 + +summary_WEEKAVG_date = 0 +summary_WEEKAVG_info = 0 +summary_WEEKAVG_odometer = 0 +summary_WEEKAVG_delta_distance = 0 +summary_WEEKAVG_kwh_charged = 0 +summary_WEEKAVG_kwh_discharged = 0 +summary_WEEKAVG_distance_unit_per_kwh = 0 +summary_WEEKAVG_kwh_per_100_distance_unit = 0 +summary_WEEKAVG_cost = 0 +summary_WEEKAVG_soc = 0 +summary_WEEKAVG_soc_avg = 0 +summary_WEEKAVG_soc_min = 0 +summary_WEEKAVG_soc_max = 0 +summary_WEEKAVG_battery12v = 0 +summary_WEEKAVG_battery12v_avg = 0 +summary_WEEKAVG_battery12v_min = 0 +summary_WEEKAVG_battery12v_max = 0 +summary_WEEKAVG_charging_sessions = 0 +summary_WEEKAVG_trip_count = 0 +summary_WEEKAVG_range = 0 +summary_WEEKAVG_address = 0 + +summary_MONTHAVG_date = 0 +summary_MONTHAVG_info = 0 +summary_MONTHAVG_odometer = 0 +summary_MONTHAVG_delta_distance = 0 +summary_MONTHAVG_kwh_charged = 0 +summary_MONTHAVG_kwh_discharged = 0 +summary_MONTHAVG_distance_unit_per_kwh = 0 +summary_MONTHAVG_kwh_per_100_distance_unit = 0 +summary_MONTHAVG_cost = 0 +summary_MONTHAVG_soc = 0 +summary_MONTHAVG_soc_avg = 0 +summary_MONTHAVG_soc_min = 0 +summary_MONTHAVG_soc_max = 0 +summary_MONTHAVG_battery12v = 0 +summary_MONTHAVG_battery12v_avg = 0 +summary_MONTHAVG_battery12v_min = 0 +summary_MONTHAVG_battery12v_max = 0 +summary_MONTHAVG_charging_sessions = 0 +summary_MONTHAVG_trip_count = 0 +summary_MONTHAVG_range = 0 +summary_MONTHAVG_address = 0 + +summary_YEARLY_date = 0 +summary_YEARLY_info = 0 +summary_YEARLY_odometer = 0 +summary_YEARLY_delta_distance = 0 +summary_YEARLY_kwh_charged = 0 +summary_YEARLY_kwh_discharged = 0 +summary_YEARLY_distance_unit_per_kwh = 0 +summary_YEARLY_kwh_per_100_distance_unit = 0 +summary_YEARLY_cost = 0 +summary_YEARLY_soc = 0 +summary_YEARLY_soc_avg = 0 +summary_YEARLY_soc_min = 0 +summary_YEARLY_soc_max = 0 +summary_YEARLY_battery12v = 0 +summary_YEARLY_battery12v_avg = 0 +summary_YEARLY_battery12v_min = 0 +summary_YEARLY_battery12v_max = 0 +summary_YEARLY_charging_sessions = 0 +summary_YEARLY_trip_count = 0 +summary_YEARLY_range = 0 +summary_YEARLY_address = 0 + +dailystats_day_TOTALS_date = 0 +dailystats_day_TOTALS_total_consumption = 0 +dailystats_day_TOTALS_regenerated_energy = 0 +dailystats_day_TOTALS_average_consumption = 0 +dailystats_day_TOTALS_engine_consumption = 0 +dailystats_day_TOTALS_climate_consumption = 0 +dailystats_day_TOTALS_onboard_electronics_consumption = 0 +dailystats_day_TOTALS_battery_care_consumption = 0 +dailystats_day_TOTALS_driven = 0 +dailystats_day_TOTALS_regenerated_energy_percentage = 0 +dailystats_day_TOTALS_average_consumption_per_100 = 0 +dailystats_day_TOTALS_engine_consumption_percentage = 0 +dailystats_day_TOTALS_climate_consumption_percentage = 0 +dailystats_day_TOTALS_onboard_electronics_consumption_percentage = 0 +dailystats_day_TOTALS_battery_care_consumption_percentage = 0 + +dailystats_day_LAST_DAY_date = 0 +dailystats_day_LAST_DAY_total_consumption = 0 +dailystats_day_LAST_DAY_regenerated_energy = 0 +dailystats_day_LAST_DAY_average_consumption = 0 +dailystats_day_LAST_DAY_engine_consumption = 0 +dailystats_day_LAST_DAY_climate_consumption = 0 +dailystats_day_LAST_DAY_onboard_electronics_consumption = 0 +dailystats_day_LAST_DAY_battery_care_consumption = 0 +dailystats_day_LAST_DAY_driven = 0 +dailystats_day_LAST_DAY_regenerated_energy_percentage = 0 +dailystats_day_LAST_DAY_average_consumption_per_100 = 0 +dailystats_day_LAST_DAY_engine_consumption_percentage = 0 +dailystats_day_LAST_DAY_climate_consumption_percentage = 0 +dailystats_day_LAST_DAY_onboard_electronics_consumption_percentage = 0 +dailystats_day_LAST_DAY_battery_care_consumption_percentage = 0 + +dailystats_trip_TOTALS_computed_kwh_charged = 0 +dailystats_trip_TOTALS_computed_day_consumption = 0 +dailystats_trip_TOTALS_computed_kwh_used = 0 +dailystats_trip_TOTALS_trip_time = 0 +dailystats_trip_TOTALS_computed_consumption_or_distance = 0 +dailystats_trip_TOTALS_distance = 0 +dailystats_trip_TOTALS_avg_speed = 0 +dailystats_trip_TOTALS_max_speed = 0 +dailystats_trip_TOTALS_idle_time = 0 + +dailystats_trip_LAST_DAY_computed_kwh_charged = 0 +dailystats_trip_LAST_DAY_computed_day_consumption = 0 +dailystats_trip_LAST_DAY_computed_kwh_used = 0 +dailystats_trip_LAST_DAY_trip_time = 0 +dailystats_trip_LAST_DAY_computed_consumption_or_distance = 0 +dailystats_trip_LAST_DAY_distance = 0 +dailystats_trip_LAST_DAY_avg_speed = 0 +dailystats_trip_LAST_DAY_max_speed = 0 +dailystats_trip_LAST_DAY_idle_time = 0 diff --git a/monitor.py b/monitor.py index 434641d..3a32ef9 100644 --- a/monitor.py +++ b/monitor.py @@ -47,6 +47,7 @@ from hyundai_kia_connect_api import VehicleManager, Vehicle, exceptions from monitor_utils import ( arg_has, + dbg, float_to_string_no_trailing_zero, get, get_bool, @@ -56,32 +57,33 @@ get_safe_float, km_to_mile, same_day, + set_dbg, + set_vin, sleep_a_minute, sleep_seconds, to_int, ) -from domoticz_utils import ( - send_dailystats_line_to_domoticz, - send_monitor_csv_line_to_domoticz, - send_tripinfo_line_to_domoticz, -) from mqtt_utils import ( - send_dailystats_line_to_mqtt, + send_dailystats_csv_line_to_mqtt, send_monitor_csv_line_to_mqtt, - send_tripinfo_line_to_mqtt, - set_vin, - stop_mqtt_loop, + send_tripinfo_csv_line_to_mqtt, + stop_mqtt, +) +from domoticz_utils import ( + send_dailystats_csv_line_to_domoticz, + send_monitor_csv_line_to_domoticz, + send_tripinfo_csv_line_to_domoticz, ) SCRIPT_DIRNAME = path.abspath(path.dirname(__file__)) logging.config.fileConfig(f"{SCRIPT_DIRNAME}/logging_config.ini") D = arg_has("debug") if D: - logging.getLogger().setLevel(logging.DEBUG) + set_dbg() # keep forceupdate and cacheupdate as keyword, but do nothing with them -KEYWORD_LIST = ["forceupdate", "cacheupdate", "debug"] +KEYWORD_LIST = ["forceupdate", "cacheupdate", "debug", "test"] KEYWORD_ERROR = False for kindex in range(1, len(sys.argv)): if sys.argv[kindex].lower() not in KEYWORD_LIST: @@ -92,6 +94,7 @@ print("Usage: python monitor.py") exit() +TEST = arg_has("test") # == read monitor in monitor.cfg =========================== parser = configparser.ConfigParser() parser.read(get_filepath("monitor.cfg")) @@ -117,14 +120,6 @@ MONITOR_SOMETHING_WRITTEN_OR_ERROR = False -# == subroutines ============================================================= -def dbg(line: str) -> bool: - """print line if debugging""" - if D: - logging.debug(line) - return D # just to make a lazy evaluation expression possible - - def writeln(filename: str, string: str) -> None: """append line at monitor text file with end of line character""" global MONITOR_SOMETHING_WRITTEN_OR_ERROR # pylint:disable=global-statement @@ -175,6 +170,7 @@ def handle_daily_stats(vehicle: Vehicle, number_of_vehicles: int) -> None: usa = int(REGION) == 3 today_time_str = datetime.now().strftime("%H:%M") last_line = get_last_line(Path(filename)) + last_line_file = last_line last_date = last_line.split(",")[0].strip() # get yyymmdd hh:mm if not usa: # get rid of timestamp, always write new cumulative data from today @@ -213,12 +209,19 @@ def handle_daily_stats(vehicle: Vehicle, number_of_vehicles: int) -> None: print( f"Writing dailystats {dailystats_date} {last_date}\nflin=[{full_line}]\nline=[{line}]\nlast=[{last_line}]" # noqa ) - file.write(full_line) - file.write("\n") + MONITOR_SOMETHING_WRITTEN_OR_ERROR = True + if TEST: + send_dailystats_csv_line_to_mqtt(last_line_file) + send_dailystats_csv_line_to_domoticz(last_line_file) + else: + file.write(full_line) + file.write("\n") + send_dailystats_csv_line_to_mqtt(full_line) + send_dailystats_csv_line_to_domoticz(full_line) + last_line = line - send_dailystats_line_to_domoticz(full_line) - send_dailystats_line_to_mqtt(full_line) + else: if D: print( @@ -235,6 +238,8 @@ def write_last_run( vehicle: Vehicle, number_of_vehicles: int, vehicle_stats: list[str] ) -> None: """write last run""" + if TEST: # do not write last run + return filename = "monitor.lastrun" vin = vehicle.VIN if number_of_vehicles > 1: @@ -272,6 +277,7 @@ def handle_day_trip_info( month_trip_info, last_date: str, last_hhmmss: str, + last_line: str, ) -> tuple[str, str]: """handle_day_trip_info""" global MONITOR_SOMETHING_WRITTEN_OR_ERROR # pylint:disable=global-statement @@ -299,13 +305,18 @@ def handle_day_trip_info( max_speed = km_to_mile(max_speed) line = f"{yyyymmdd},{hhmmss},{trip.drive_time},{trip.idle_time},{float_to_string_no_trailing_zero(distance)},{avg_speed:.0f},{max_speed:.0f}" # noqa _ = D and dbg(f"Writing tripinfo line:[{line}]") - file.write(line) - file.write("\n") MONITOR_SOMETHING_WRITTEN_OR_ERROR = True + if TEST: + send_tripinfo_csv_line_to_mqtt(last_line) + send_tripinfo_csv_line_to_domoticz(last_line) + else: + file.write(line) + file.write("\n") + send_tripinfo_csv_line_to_mqtt(line) + send_tripinfo_csv_line_to_domoticz(line) + last_date = yyyymmdd last_hhmmss = hhmmss - send_tripinfo_line_to_domoticz(line) - send_tripinfo_line_to_mqtt(line) else: _ = D and dbg(f"Skipping trip: {yyyymmdd},{hhmmss}") else: @@ -363,6 +374,7 @@ def handle_trip_info( month_trip_info, last_date, last_hhmmss, + last_line, ) @@ -445,10 +457,14 @@ def handle_one_vehicle( break # finished if not same: _ = D and dbg(f"Writing1:\nline=[{line}]\nlast=[{last_line}]") + if TEST: + send_monitor_csv_line_to_mqtt(last_line) + send_monitor_csv_line_to_domoticz(last_line) + else: + writeln(filename, line) + send_monitor_csv_line_to_mqtt(line) + send_monitor_csv_line_to_domoticz(line) - writeln(filename, line) - send_monitor_csv_line_to_domoticz(line) - send_monitor_csv_line_to_mqtt(line) handle_daily_stats(vehicle, number_of_vehicles) vehicle_stats = [ str(newest_updated_at), @@ -555,7 +571,10 @@ def handle_vehicles(login: bool) -> bool: error = False number_of_vehicles = len(MANAGER.vehicles) for _, vehicle in MANAGER.vehicles.items(): - set_vin(vehicle.VIN) + if TEST: # use fake VIN + set_vin("KMHKR81CPNU012345") + else: + set_vin(vehicle.VIN) error = handle_one_vehicle(MANAGER, vehicle, number_of_vehicles) if error: # something gone wrong, exit vehicles loop error_string = "Error occurred in handle_one_vehicle()" @@ -641,7 +660,8 @@ def monitor(): logging.error("Too many subsequent errors occurred, exiting monitor.py") sys.exit(-1) - stop_mqtt_loop() + stop_mqtt() + sys.exit(0) monitor() diff --git a/monitor_utils.py b/monitor_utils.py index 58d5fc7..0996ff3 100644 --- a/monitor_utils.py +++ b/monitor_utils.py @@ -1,6 +1,7 @@ # == monitor_utils.py Author: Zuinige Rijder ========= """ monitor utils """ # pylint:disable=logging-fstring-interpolation + import configparser import errno import logging @@ -18,24 +19,99 @@ from urllib.request import urlopen, Request +VIN = "" # filled by set_vin() or determine_vin() method + +D = False + + +def d() -> bool: + """return D""" + return D + + +def dbg(line: str) -> bool: + """print line if debugging""" + if D: + logging.debug(line) + return D # just to make a lazy evaluation expression possible + + +def set_dbg() -> None: + """set_dbg""" + global D # pylint:disable=global-statement + D = True + logging.getLogger().setLevel(logging.DEBUG) + + +def get_splitted_list_item(the_list: list[str], index: int) -> list[str]: + """get splitted item from list""" + if index < 0 or index >= len(the_list): + return ["", ""] + items = the_list[index].split(";") + if len(items) != 2: + return ["", ""] + return [items[0].strip(), items[1].strip()] + + +def set_vin(vin: str) -> None: + """set_vin""" + global VIN # pylint: disable=global-statement + VIN = vin + + +def determine_vin(lastrun_filename: Path) -> None: + """determine_vin""" + # get vin information from monitor.lastrun + with lastrun_filename.open("r", encoding="utf-8") as lastrun_file: + lastrun_lines = lastrun_file.readlines() + vin = get_splitted_list_item(lastrun_lines, 1)[1] + set_vin(vin) + + +def get_vin() -> str: + """get_vin""" + return VIN + + def get_items_monitor_csv() -> list: """get_items_monitor_csv""" - items = "monitor_datetime, monitor_longitude, monitor_latitude, monitor_engineon, monitor_battery12v, monitor_odometer, monitor_soc, monitor_charging, monitor_plugged, monitor_address, monitor_evrange" # noqa - result = [x.strip() for x in items.split(",")] + items = "datetime, longitude, latitude, engineon, battery12v, odometer, soc, charging, plugged, address, evrange" # noqa + result = [x.strip().lower() for x in items.split(",")] return result def get_items_monitor_tripinfo_csv() -> list: """get_items_monitor_tripinfo_csv""" - items = "trip_date, trip_starttime, trip_drivetime, trip_idletime, trip_distance, trip_avgspeed, trip_maxspeed" # noqa - result = [x.strip() for x in items.split(",")] + items = "date, starttime, drivetime, idletime, distance, avgspeed, maxspeed" + result = [x.strip().lower() for x in items.split(",")] return result def get_items_monitor_dailystats_csv() -> list: """get_items_monitor_dailystats_csv""" - items = "dailystats_date, dailystats_distance, dailystats_distance_unit, dailystats_total_consumed, dailystats_regenerated_energy, dailystats_engine_consumption, dailystats_climate_consumption, dailystats_onboard_electronics_consumption, dailystats_battery_care_consumption" # noqa - result = [x.strip() for x in items.split(",")] + items = "date, distance, distance_unit, total_consumed, regenerated_energy, engine_consumption, climate_consumption, onboard_electronics_consumption, battery_care_consumption" # noqa + result = [x.strip().lower() for x in items.split(",")] + return result + + +def get_items_summary() -> list: + """get_items_summary""" + items = "period, date, info, odometer, delta_distance, kwh_charged, kwh_discharged, distance_unit_per_kwh, kwh_per_100_distance_unit, cost, soc, soc_avg, soc_min, soc_max, battery12v, battery12v_avg, battery12v_min, battery12v_max, charging_sessions, trip_count, range, address" # noqa + result = [x.strip().lower() for x in items.split(",")] + return result + + +def get_items_dailystats_day() -> list: + """get_items_dailystat_day""" + items = "date, total_consumption, regenerated_energy, average_consumption, engine_consumption, climate_consumption, onboard_electronics_consumption, battery_care_consumption, driven, regenerated_energy_percentage, average_consumption_per_100, engine_consumption_percentage, climate_consumption_percentage, onboard_electronics_consumption_percentage, battery_care_consumption_percentage" # noqa + result = [x.strip().lower() for x in items.split(",")] + return result + + +def get_items_dailystat_trip() -> list: + """get_items_dailystat_trip""" + items = "computed_kwh_charged, computed_day_consumption, computed_kwh_used, trip_time, computed_consumption_or_distance, distance, avg_speed, max_speed, idle_time" # noqa + result = [x.strip().lower() for x in items.split(",")] return result @@ -89,7 +165,7 @@ def get_vin_arg() -> str: def sleep_seconds(seconds: int) -> None: """sleep seconds""" - logging.debug(f"Sleeping {seconds} seconds") + _ = D and dbg(f"Sleeping {seconds} seconds") time.sleep(seconds) @@ -365,7 +441,7 @@ def execute_request(url: str, data: str, headers: dict) -> str: with urlopen(request, timeout=30) as response: body = response.read() content = body.decode("utf-8") - logging.debug(content) + _ = D and dbg(content) return content except HTTPError as error: errorstring = str(error.status) + ": " + error.reason diff --git a/mqtt_utils.py b/mqtt_utils.py index 8a8ef24..dbb63bf 100644 --- a/mqtt_utils.py +++ b/mqtt_utils.py @@ -11,18 +11,37 @@ from paho.mqtt import client as mqtt_client from monitor_utils import ( + dbg, get, + d, get_bool, get_filepath, + get_items_dailystat_trip, + get_items_dailystats_day, get_items_monitor_csv, get_items_monitor_dailystats_csv, get_items_monitor_tripinfo_csv, + get_items_summary, + get_vin, ) ITEMS_MONITOR_CSV = get_items_monitor_csv() -ITEMS_MONITOR_TRIPINFO_CSV = get_items_monitor_tripinfo_csv() -ITEMS_MONITOR_DAILYSTATS_CSV = get_items_monitor_dailystats_csv() +for IDX in range(len(ITEMS_MONITOR_CSV)): # pylint:disable=consider-using-enumerate + ITEMS_MONITOR_CSV[IDX] = f"monitor/monitor/{ITEMS_MONITOR_CSV[IDX]}" +ITEMS_TRIPINFO_CSV = get_items_monitor_tripinfo_csv() +for IDX in range(len(ITEMS_TRIPINFO_CSV)): # pylint:disable=consider-using-enumerate + ITEMS_TRIPINFO_CSV[IDX] = f"monitor/tripinfo/{ITEMS_TRIPINFO_CSV[IDX]}" + +ITEMS_DAILYSTATS_CSV = get_items_monitor_dailystats_csv() +for IDX in range(len(ITEMS_DAILYSTATS_CSV)): # pylint:disable=consider-using-enumerate + ITEMS_DAILYSTATS_CSV[IDX] = f"monitor/dailystats/{ITEMS_DAILYSTATS_CSV[IDX]}" + +ITEMS_SUMMARY = get_items_summary() + +ITEMS_DAILYSTATS_DAY = get_items_dailystats_day() + +ITEMS_DAILYSTATS_TRIP = get_items_dailystat_trip() PARSER = configparser.ConfigParser() PARSER.read(get_filepath("monitor.cfg")) @@ -37,13 +56,6 @@ MQTT_MAIN_TOPIC = get(mqtt_settings, "mqtt_main_topic", "hyundai_kia_connect_monitor") MQTT_CLIENT = None # will be filled at MQTT connect if configured -VIN = None # filled by set_vin() method - - -def set_vin(vin: str) -> None: - """set_vin""" - global VIN # pylint: disable=global-statement - VIN = vin # == connect MQTT ======================================================== @@ -57,31 +69,31 @@ def connect_mqtt() -> mqtt_client.Client: def on_connect(client, userdata, flags, rc): # pylint: disable=unused-argument if rc == 0: - logging.debug("Connected to MQTT Broker!") + _ = d() and dbg("Connected to MQTT Broker!") else: logging.error("Failed to connect to MQTT Broker, return code %d\n", rc) def on_disconnect(client, userdata, rc): # pylint: disable=unused-argument - logging.debug("Disconnected with result code: %s", rc) + _ = d() and dbg(f"Disconnected with result code: {rc}") reconnect_count = 0 reconnect_delay = mqtt_first_reconnect_delay while reconnect_count < mqtt_max_reconnect_count: - logging.debug("Reconnecting in %d seconds...", reconnect_delay) + _ = d() and dbg(f"Reconnecting in {reconnect_delay} seconds...") time.sleep(reconnect_delay) try: client.reconnect() - logging.debug("Reconnected successfully!") + _ = d() and dbg("Reconnected successfully!") return except Exception as reconnect_ex: # pylint: disable=broad-except - logging.error("%s. Reconnect failed. Retrying...", reconnect_ex) + logging.error(f"{reconnect_ex}. Reconnect failed. Retrying...") reconnect_delay *= mqtt_reconnect_rate reconnect_delay = min(reconnect_delay, mqtt_max_reconnect_delay) reconnect_count += 1 - logging.info("Reconnect failed after %s attempts. Exiting...", reconnect_count) + logging.info(f"Reconnect failed after {reconnect_count} attempts. Exiting...") - mqtt_client_id = f"{MQTT_MAIN_TOPIC}-{VIN}" + mqtt_client_id = f"{MQTT_MAIN_TOPIC}-{get_vin()}" client = mqtt_client.Client(mqtt_client_id) client.on_connect = on_connect client.on_disconnect = on_disconnect @@ -97,7 +109,7 @@ def start_mqtt_loop() -> None: if not MQTT_CLIENT: while True: try: - logging.debug("Trying to connected to MQTT Broker") + _ = d() and dbg("Trying to connected to MQTT Broker") MQTT_CLIENT = connect_mqtt() MQTT_CLIENT.loop_start() break @@ -109,10 +121,10 @@ def start_mqtt_loop() -> None: time.sleep(60) -def stop_mqtt_loop() -> None: - """stop_mqtt_loop""" - if MQTT_CLIENT: - logging.debug("Trying stop MQTT Broker loop") +def stop_mqtt() -> None: + """stop_mqtt""" + if MQTT_CLIENT and SEND_TO_MQTT: + logging.debug("Stopping MQTT") MQTT_CLIENT.loop_stop() @@ -122,10 +134,10 @@ def send_to_mqtt(subtopic: str, value: str) -> None: start_mqtt_loop() msg_count = 1 - topic = f"{MQTT_MAIN_TOPIC}/{VIN}/{subtopic}" + topic = f"{MQTT_MAIN_TOPIC}/{get_vin()}/{subtopic}" msg = f"{value}" logging.debug( # pylint:disable=logging-fstring-interpolation - f"topic: {topic}, msg: {msg}" + f"send_to_mqtt: {topic} = {msg}" ) while True: try: @@ -134,6 +146,7 @@ def send_to_mqtt(subtopic: str, value: str) -> None: result = MQTT_CLIENT.publish(topic, msg, qos=1, retain=True) status = result[0] if status == 0: + logging.debug(f"Send {msg} to topic {topic}") msg_count = 6 else: error = True @@ -155,15 +168,34 @@ def send_to_mqtt(subtopic: str, value: str) -> None: break -def send_line(headers: list, line: str) -> None: - """send_line""" - splitted = line.split(",") +def send_splitted_line( + headers: list, splitted: list, replace_empty_by_0: bool, skip_first: bool +) -> None: + """send_splitted_line""" if len(splitted) < len(headers): - logging.info(f"line does not have all elements: {line}\n{headers}") + logging.warning( + f"line does not have all elements: {splitted}\nHEADERS={headers}" + ) return + skipped_first = not skip_first for i in range(len(splitted)): # pylint:disable=consider-using-enumerate - send_to_mqtt(headers[i], splitted[i].strip()) + if i < len(headers): + if skipped_first: + value = splitted[i].strip() + if replace_empty_by_0 and value == "": + value = "0" + send_to_mqtt(headers[i], value) + else: + skipped_first = True + + +def send_line( + headers: list, line: str, replace_empty_by_0: bool = True, skip_first: bool = False +) -> None: + """send_line""" + splitted = line.split(",") + send_splitted_line(headers, splitted, replace_empty_by_0, skip_first) def send_monitor_csv_line_to_mqtt(line: str) -> None: @@ -172,13 +204,52 @@ def send_monitor_csv_line_to_mqtt(line: str) -> None: send_line(ITEMS_MONITOR_CSV, line) -def send_tripinfo_line_to_mqtt(line: str) -> None: - """send_tripinfo_line_to_mqtt""" +def send_tripinfo_csv_line_to_mqtt(line: str) -> None: + """send_tripinfo_csv_line_to_mqtt""" + if SEND_TO_MQTT: + send_line(ITEMS_TRIPINFO_CSV, line) + + +def send_dailystats_csv_line_to_mqtt(line: str) -> None: + """send_dailystats_csv_line_to_mqtt""" + if SEND_TO_MQTT: + send_line(ITEMS_DAILYSTATS_CSV, line) + + +def get_items(subtopic: str, items: list[str]) -> list[str]: + """get_items""" + new_items: list[str] = [] + for item in items: + new_items.append(f"{subtopic}/{item}") + return new_items + + +def send_summary_line_to_mqtt(line: str) -> None: + """send_summary_line_to_mqtt""" + if SEND_TO_MQTT: + splitted = [x.strip() for x in line.split(",")] + period = splitted[0].replace(" ", "") + if ( + period + in "TRIP, DAY, WEEK, MONTH, YEAR, TRIPAVG, DAYAVG, WEEKAVG, MONTHAVG, YEARLY" # noqa + ): + send_splitted_line( + get_items(f"summary/{period}", ITEMS_SUMMARY), splitted, True, True + ) + + +def send_dailystats_day_line_to_mqtt(postfix: str, line: str) -> None: + """send_dailystats_day_line_to_mqtt""" if SEND_TO_MQTT: - send_line(ITEMS_MONITOR_TRIPINFO_CSV, line) + send_line(get_items(f"dailystats_day/{postfix}", ITEMS_DAILYSTATS_DAY), line) -def send_dailystats_line_to_mqtt(line: str) -> None: - """send_dailystats_line_to_mqtt""" +def send_dailystats_trip_line_to_mqtt( + postfix: str, line: str, skip_first_two: bool = False +) -> None: + """send_dailystats_trip_line_to_mqtt""" if SEND_TO_MQTT: - send_line(ITEMS_MONITOR_DAILYSTATS_CSV, line) + items = get_items(f"dailystats_trip/{postfix}", ITEMS_DAILYSTATS_TRIP) + if skip_first_two: + items = items[2:] + send_line(items, line, replace_empty_by_0=False) diff --git a/requirements.txt b/requirements.txt index 40539e9..68a1654 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ hyundai_kia_connect_api>=3.24.0 beautifulsoup4>=4.10.0 -paho_mqtt>=1.6.1 +paho_mqtt>=1.6.1,<2.0 python_dateutil>=2.8.2 pytz>=2021.3 requests>=2.28.1 diff --git a/summary.py b/summary.py index 2c9a596..d5794bd 100644 --- a/summary.py +++ b/summary.py @@ -18,12 +18,17 @@ import typing import gspread from dateutil import parser +from domoticz_utils import SEND_TO_DOMOTICZ, send_summary_line_to_domoticz from monitor_utils import ( + dbg, + determine_vin, get_filepath, arg_has, get, + get_splitted_list_item, get_vin_arg, safe_divide, + set_dbg, sleep_a_minute, split_on_comma, to_int, @@ -39,19 +44,13 @@ split_output_to_sheet_list, float_to_string_no_trailing_zero, ) +from mqtt_utils import SEND_TO_MQTT, send_summary_line_to_mqtt, stop_mqtt SCRIPT_DIRNAME = path.abspath(path.dirname(__file__)) logging.config.fileConfig(f"{SCRIPT_DIRNAME}/logging_config.ini") D = arg_has("debug") if D: - logging.getLogger().setLevel(logging.DEBUG) - - -def dbg(line: str) -> bool: - """print line if debugging""" - if D: - logging.debug(line) - return D # just to make a lazy evaluation expression possible + set_dbg() KEYWORD_LIST = [ @@ -334,8 +333,7 @@ def print_output_and_update_queue(output: str) -> None: total_line += ", " print(total_line) - if SHEETUPDATE: - LAST_OUTPUT_QUEUE.append(total_line) + LAST_OUTPUT_QUEUE.append(total_line) def sheet_append_first_rows(row_a: str, row_b: str) -> None: @@ -459,16 +457,6 @@ def get_address(split: list[str]) -> str: return location_str -def get_splitted_list_item(the_list: list[str], index: int) -> list[str]: - """get splitted item from list""" - if index < 0 or index >= len(the_list): - return ["", ""] - items = the_list[index].split(";") - if len(items) != 2: - return ["", ""] - return [items[0].strip(), items[1].strip()] - - if not MONITOR_CSV_FILENAME.is_file(): logging.error(f"ERROR: file does not exist: {MONITOR_CSV_FILENAME}") sys.exit(-1) @@ -686,6 +674,14 @@ def print_summary( f"{date} {time_str}, {odo:.1f}, {float_to_string_no_trailing_zero(delta_odo)}, {float_to_string_no_trailing_zero(discharged_kwh)}, {float_to_string_no_trailing_zero(charged_kwh)}" # noqa ) + # get information from monitor.lastrun + with LASTRUN_FILENAME.open("r", encoding="utf-8") as lastrun_file: + lastrun_lines = lastrun_file.readlines() + last_upd_dt = get_splitted_list_item(lastrun_lines, 2)[1] + location_last_upd_dt = get_splitted_list_item(lastrun_lines, 3)[1] + if len(lastrun_lines) > 6: # error occurred, line 6 contains error_string + last_upd_dt = f"{last_upd_dt} ERROR: {lastrun_lines[6]}" + if SHEETUPDATE and prefix.startswith("SHEET "): prefix = prefix.replace("SHEET ", "") last_line = get_last_line(MONITOR_CSV_FILENAME).replace(",", ";") @@ -693,17 +689,6 @@ def print_summary( last_run_dt = last_run_datetime.strftime("%Y-%m-%d %H:%M ") + get_translation( TR_HELPER, last_run_datetime.strftime("%a") ) - lastrun_lines = [] - if LASTRUN_FILENAME.is_file(): - with LASTRUN_FILENAME.open("r", encoding="utf-8") as lastrun_file: - lastrun_lines = lastrun_file.readlines() - last_updated_at = get_splitted_list_item(lastrun_lines, 2) - location_last_updated_at = get_splitted_list_item(lastrun_lines, 3) - last_upd_dt = last_updated_at[1] - location_last_upd_dt = location_last_updated_at[1] - if len(lastrun_lines) > 6: # error occurred, line 6 contains error_string - last_upd_dt = f"{last_upd_dt} ERROR: {lastrun_lines[6]}" - SHEET_ROW_A = f"{TR.last_run},{TR.vehicle_upd},{TR.gps_update},{TR.last_entry},{TR.last_address},{TR.odometer} {ODO_METRIC},{TR.driven} {ODO_METRIC},+kWh,-kWh,{ODO_METRIC}/kWh,kWh/100{ODO_METRIC},{TR.cost} {COST_CURRENCY},{TR.soc_perc},{TR.avg} {TR.soc_perc},{TR.min} {TR.soc_perc},{TR.max} {TR.soc_perc},{TR.volt12_perc},{TR.avg} {TR.volt12_perc},{TR.min} {TR.volt12_perc},{TR.max} {TR.volt12_perc},{TR.charges},{TR.trips},{TR.ev_range}" # noqa SHEET_ROW_B = f"{last_run_dt},{last_upd_dt},{location_last_upd_dt},{last_line},{location_str},{odo:.1f},{float_to_string_no_trailing_zero(delta_odo)},{float_to_string_no_trailing_zero(charged_kwh)},{float_to_string_no_trailing_zero(discharged_kwh)},{km_mi_per_kwh_str},{kwh_per_km_mi_str},{cost_str},{float_to_string_no_trailing_zero(t_soc_cur)},{float_to_string_no_trailing_zero(t_soc_avg)},{float_to_string_no_trailing_zero(t_soc_min)},{float_to_string_no_trailing_zero(t_soc_max)},{t_volt12_cur},{t_volt12_avg},{t_volt12_min},{t_volt12_max},{t_charges},{t_trips},{ev_range}" # noqa else: @@ -1084,6 +1069,20 @@ def summary(): print_header_and_update_queue() +def send_to_mqtt_domoticz() -> None: + """send_to_mqtt_domoticz""" + idx = 0 + for item in LAST_OUTPUT_QUEUE: + idx += 1 + if idx >= (len(LAST_OUTPUT_QUEUE) - 10) and idx != len( + LAST_OUTPUT_QUEUE + ): # last 10 items excluding last header item + send_summary_line_to_mqtt(item) + send_summary_line_to_domoticz(item) + + stop_mqtt() + + # always rewrite charge file, because input might be changed CHARGE_CSV_FILE = CHARGE_CSV_FILENAME.open("w", encoding="utf-8") write_charge_csv("date, odometer, +kWh, end charged SOC%") @@ -1119,6 +1118,12 @@ def summary(): traceback.print_exc() RETRIES = sleep_a_minute(RETRIES) +if SEND_TO_DOMOTICZ or SEND_TO_MQTT: + if SEND_TO_MQTT: + determine_vin(LASTRUN_FILENAME) + send_to_mqtt_domoticz() + + if RETRIES == -1: - exit(0) -exit(-1) + sys.exit(0) +sys.exit(-1) diff --git a/tests/OUTPUT/test.dailystats.mqtt_domoticz.log b/tests/OUTPUT/test.dailystats.mqtt_domoticz.log new file mode 100644 index 0000000..847ef48 --- /dev/null +++ b/tests/OUTPUT/test.dailystats.mqtt_domoticz.log @@ -0,0 +1,96 @@ +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/date = +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/total_consumption = 303.7kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/regenerated_energy = 43kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/average_consumption = 5.6km/kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/engine_consumption = 262kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/climate_consumption = 12.7kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/onboard_electronics_consumption = 28.6kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/battery_care_consumption = 0.4kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/driven = 1698km +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/regenerated_energy_percentage = 14.2% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/average_consumption_per_100 = 17.9kWh/100km +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/engine_consumption_percentage = 86% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/climate_consumption_percentage = 4.2% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/onboard_electronics_consumption_percentage = 9.4% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/battery_care_consumption_percentage = 0.1% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/total_consumption = 2.3kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/regenerated_energy = 0.8kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/average_consumption = 5.7km/kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/engine_consumption = 1.8kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/climate_consumption = 0.1kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/onboard_electronics_consumption = 0.4kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/battery_care_consumption = 0kWh +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/driven = 13km +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/regenerated_energy_percentage = 35.5% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/average_consumption_per_100 = 17.6kWh/100km +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/engine_consumption_percentage = 80% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/climate_consumption_percentage = 3.4% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/onboard_electronics_consumption_percentage = 17% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/LAST_DAY/battery_care_consumption_percentage = 0% +dailystats_day_TOTALS_date = +dailystats_day_TOTALS_total_consumption = 303.7kWh +dailystats_day_TOTALS_regenerated_energy = 43kWh +dailystats_day_TOTALS_average_consumption = 5.6km/kWh +dailystats_day_TOTALS_engine_consumption = 262kWh +dailystats_day_TOTALS_climate_consumption = 12.7kWh +dailystats_day_TOTALS_onboard_electronics_consumption = 28.6kWh +dailystats_day_TOTALS_battery_care_consumption = 0.4kWh +dailystats_day_TOTALS_driven = 1698km +dailystats_day_TOTALS_regenerated_energy_percentage = 14.2% +dailystats_day_TOTALS_average_consumption_per_100 = 17.9kWh/100km +dailystats_day_TOTALS_engine_consumption_percentage = 86% +dailystats_day_TOTALS_climate_consumption_percentage = 4.2% +dailystats_day_TOTALS_onboard_electronics_consumption_percentage = 9.4% +dailystats_day_TOTALS_battery_care_consumption_percentage = 0.1% +dailystats_day_LAST_DAY_date = 2023-02-19 +dailystats_day_LAST_DAY_total_consumption = 2.3kWh +dailystats_day_LAST_DAY_regenerated_energy = 0.8kWh +dailystats_day_LAST_DAY_average_consumption = 5.7km/kWh +dailystats_day_LAST_DAY_engine_consumption = 1.8kWh +dailystats_day_LAST_DAY_climate_consumption = 0.1kWh +dailystats_day_LAST_DAY_onboard_electronics_consumption = 0.4kWh +dailystats_day_LAST_DAY_battery_care_consumption = 0kWh +dailystats_day_LAST_DAY_driven = 13km +dailystats_day_LAST_DAY_regenerated_energy_percentage = 35.5% +dailystats_day_LAST_DAY_average_consumption_per_100 = 17.6kWh/100km +dailystats_day_LAST_DAY_engine_consumption_percentage = 80% +dailystats_day_LAST_DAY_climate_consumption_percentage = 3.4% +dailystats_day_LAST_DAY_onboard_electronics_consumption_percentage = 17% +dailystats_day_LAST_DAY_battery_care_consumption_percentage = 0% +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/TOTALS/computed_kwh_charged = (+302.7kWh) +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/TOTALS/computed_day_consumption = (5.6km/kWh) +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/TOTALS/computed_kwh_used = +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/TOTALS/trip_time = 2551min +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/TOTALS/computed_consumption_or_distance = +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/TOTALS/distance = 2002km +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/TOTALS/avg_speed = 55km/h +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/TOTALS/max_speed = 125km/h +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/TOTALS/idle_time = 352min +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/LAST_DAY/computed_kwh_charged = (+27.6kWh) +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/LAST_DAY/computed_day_consumption = (6.3km/kWh) +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/LAST_DAY/computed_kwh_used = (0.7kWh) +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/LAST_DAY/trip_time = 17:36-17:44 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/LAST_DAY/computed_consumption_or_distance = (9.6km/kWh) +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/LAST_DAY/distance = 6km +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/LAST_DAY/avg_speed = 52km/h +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/LAST_DAY/max_speed = 116km/h +hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_trip/LAST_DAY/idle_time = 0min +dailystats_trip_TOTALS_computed_kwh_charged = (+302.7kWh) +dailystats_trip_TOTALS_computed_day_consumption = (5.6km/kWh) +dailystats_trip_TOTALS_computed_kwh_used = +dailystats_trip_TOTALS_trip_time = 2551min +dailystats_trip_TOTALS_computed_consumption_or_distance = +dailystats_trip_TOTALS_distance = 2002km +dailystats_trip_TOTALS_avg_speed = 55km/h +dailystats_trip_TOTALS_max_speed = 125km/h +dailystats_trip_TOTALS_idle_time = 352min +dailystats_trip_LAST_DAY_computed_kwh_charged = (+27.6kWh) +dailystats_trip_LAST_DAY_computed_day_consumption = (6.3km/kWh) +dailystats_trip_LAST_DAY_computed_kwh_used = (0.7kWh) +dailystats_trip_LAST_DAY_trip_time = 17:36-17:44 +dailystats_trip_LAST_DAY_computed_consumption_or_distance = (9.6km/kWh) +dailystats_trip_LAST_DAY_distance = 6km +dailystats_trip_LAST_DAY_avg_speed = 52km/h +dailystats_trip_LAST_DAY_max_speed = 116km/h +dailystats_trip_LAST_DAY_idle_time = 0min diff --git a/tests/OUTPUT/test.summary.mqtt_domoticz.log b/tests/OUTPUT/test.summary.mqtt_domoticz.log new file mode 100644 index 0000000..cb51f6b --- /dev/null +++ b/tests/OUTPUT/test.summary.mqtt_domoticz.log @@ -0,0 +1,420 @@ +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/info = 17:48 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/delta_distance = 6.7 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/kwh_charged = 0 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/kwh_discharged = -0.7 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/distance_unit_per_kwh = 9.2 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/kwh_per_100_distance_unit = 10.8 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/cost = 0.18 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/soc_avg = 58 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/soc_min = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/soc_max = 58 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/battery12v_avg = 85 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/battery12v_min = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/battery12v_max = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/charging_sessions = 0 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/trip_count = 1 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIP/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_TRIP_date = 2023-02-19 +summary_TRIP_info = 17:48 +summary_TRIP_odometer = 23589.5 +summary_TRIP_delta_distance = 6.7 +summary_TRIP_kwh_charged = 0 +summary_TRIP_kwh_discharged = -0.7 +summary_TRIP_distance_unit_per_kwh = 9.2 +summary_TRIP_kwh_per_100_distance_unit = 10.8 +summary_TRIP_cost = 0.18 +summary_TRIP_soc = 57 +summary_TRIP_soc_avg = 58 +summary_TRIP_soc_min = 57 +summary_TRIP_soc_max = 58 +summary_TRIP_battery12v = 84 +summary_TRIP_battery12v_avg = 85 +summary_TRIP_battery12v_min = 84 +summary_TRIP_battery12v_max = 86 +summary_TRIP_charging_sessions = 0 +summary_TRIP_trip_count = 1 +summary_TRIP_range = 204 +summary_TRIP_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/info = Sun +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/delta_distance = 13.9 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/kwh_charged = 27.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/kwh_discharged = -2.2 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/distance_unit_per_kwh = 6.4 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/kwh_per_100_distance_unit = 15.7 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/cost = 0.54 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/soc_avg = 49 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/soc_min = 22 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/soc_max = 60 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/battery12v_avg = 85 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/battery12v_min = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/battery12v_max = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/charging_sessions = 1 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/trip_count = 2 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAY/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_DAY_date = 2023-02-19 +summary_DAY_info = Sun +summary_DAY_odometer = 23589.5 +summary_DAY_delta_distance = 13.9 +summary_DAY_kwh_charged = 27.6 +summary_DAY_kwh_discharged = -2.2 +summary_DAY_distance_unit_per_kwh = 6.4 +summary_DAY_kwh_per_100_distance_unit = 15.7 +summary_DAY_cost = 0.54 +summary_DAY_soc = 57 +summary_DAY_soc_avg = 49 +summary_DAY_soc_min = 22 +summary_DAY_soc_max = 60 +summary_DAY_battery12v = 84 +summary_DAY_battery12v_avg = 85 +summary_DAY_battery12v_min = 84 +summary_DAY_battery12v_max = 86 +summary_DAY_charging_sessions = 1 +summary_DAY_trip_count = 2 +summary_DAY_range = 204 +summary_DAY_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/info = WK 07 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/delta_distance = 452.3 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/kwh_charged = 92.2 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/kwh_discharged = -80.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/distance_unit_per_kwh = 5.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/kwh_per_100_distance_unit = 17.8 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/cost = 19.82 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/soc_avg = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/soc_min = 22 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/soc_max = 100 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/battery12v_avg = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/battery12v_min = 81 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/battery12v_max = 90 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/charging_sessions = 7 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/trip_count = 14 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEK/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_WEEK_date = 2023-02-19 +summary_WEEK_info = WK 07 +summary_WEEK_odometer = 23589.5 +summary_WEEK_delta_distance = 452.3 +summary_WEEK_kwh_charged = 92.2 +summary_WEEK_kwh_discharged = -80.6 +summary_WEEK_distance_unit_per_kwh = 5.6 +summary_WEEK_kwh_per_100_distance_unit = 17.8 +summary_WEEK_cost = 19.82 +summary_WEEK_soc = 57 +summary_WEEK_soc_avg = 57 +summary_WEEK_soc_min = 22 +summary_WEEK_soc_max = 100 +summary_WEEK_battery12v = 84 +summary_WEEK_battery12v_avg = 86 +summary_WEEK_battery12v_min = 81 +summary_WEEK_battery12v_max = 90 +summary_WEEK_charging_sessions = 7 +summary_WEEK_trip_count = 14 +summary_WEEK_range = 204 +summary_WEEK_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/info = Feb +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/delta_distance = 590.3 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/kwh_charged = 106.7 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/kwh_discharged = -108.2 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/distance_unit_per_kwh = 5.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/kwh_per_100_distance_unit = 18.3 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/cost = 26.61 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/soc_avg = 50 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/soc_min = 22 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/soc_max = 100 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/battery12v_avg = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/battery12v_min = 76 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/battery12v_max = 93 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/charging_sessions = 10 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/trip_count = 35 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTH/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_MONTH_date = 2023-02-19 +summary_MONTH_info = Feb +summary_MONTH_odometer = 23589.5 +summary_MONTH_delta_distance = 590.3 +summary_MONTH_kwh_charged = 106.7 +summary_MONTH_kwh_discharged = -108.2 +summary_MONTH_distance_unit_per_kwh = 5.5 +summary_MONTH_kwh_per_100_distance_unit = 18.3 +summary_MONTH_cost = 26.61 +summary_MONTH_soc = 57 +summary_MONTH_soc_avg = 50 +summary_MONTH_soc_min = 22 +summary_MONTH_soc_max = 100 +summary_MONTH_battery12v = 84 +summary_MONTH_battery12v_avg = 86 +summary_MONTH_battery12v_min = 76 +summary_MONTH_battery12v_max = 93 +summary_MONTH_charging_sessions = 10 +summary_MONTH_trip_count = 35 +summary_MONTH_range = 204 +summary_MONTH_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/info = 2023 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/delta_distance = 1742.4 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/kwh_charged = 298.4 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/kwh_discharged = -312.2 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/distance_unit_per_kwh = 5.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/kwh_per_100_distance_unit = 17.9 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/cost = 76.80 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/soc_avg = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/soc_min = 19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/soc_max = 100 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/battery12v_avg = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/battery12v_min = 76 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/battery12v_max = 95 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/charging_sessions = 18 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/trip_count = 89 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEAR/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_YEAR_date = 2023-02-19 +summary_YEAR_info = 2023 +summary_YEAR_odometer = 23589.5 +summary_YEAR_delta_distance = 1742.4 +summary_YEAR_kwh_charged = 298.4 +summary_YEAR_kwh_discharged = -312.2 +summary_YEAR_distance_unit_per_kwh = 5.6 +summary_YEAR_kwh_per_100_distance_unit = 17.9 +summary_YEAR_cost = 76.80 +summary_YEAR_soc = 57 +summary_YEAR_soc_avg = 57 +summary_YEAR_soc_min = 19 +summary_YEAR_soc_max = 100 +summary_YEAR_battery12v = 84 +summary_YEAR_battery12v_avg = 86 +summary_YEAR_battery12v_min = 76 +summary_YEAR_battery12v_max = 95 +summary_YEAR_charging_sessions = 18 +summary_YEAR_trip_count = 89 +summary_YEAR_range = 204 +summary_YEAR_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/info = 89t +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/delta_distance = 19.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/kwh_charged = 3.4 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/kwh_discharged = -3.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/distance_unit_per_kwh = 5.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/kwh_per_100_distance_unit = 17.9 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/cost = 0.86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/soc_avg = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/soc_min = 19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/soc_max = 100 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/battery12v_avg = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/battery12v_min = 76 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/battery12v_max = 95 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/charging_sessions = 0.2 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/trip_count = 1 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/TRIPAVG/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_TRIPAVG_date = 2023-02-19 +summary_TRIPAVG_info = 89t +summary_TRIPAVG_odometer = 23589.5 +summary_TRIPAVG_delta_distance = 19.6 +summary_TRIPAVG_kwh_charged = 3.4 +summary_TRIPAVG_kwh_discharged = -3.5 +summary_TRIPAVG_distance_unit_per_kwh = 5.6 +summary_TRIPAVG_kwh_per_100_distance_unit = 17.9 +summary_TRIPAVG_cost = 0.86 +summary_TRIPAVG_soc = 57 +summary_TRIPAVG_soc_avg = 57 +summary_TRIPAVG_soc_min = 19 +summary_TRIPAVG_soc_max = 100 +summary_TRIPAVG_battery12v = 84 +summary_TRIPAVG_battery12v_avg = 86 +summary_TRIPAVG_battery12v_min = 76 +summary_TRIPAVG_battery12v_max = 95 +summary_TRIPAVG_charging_sessions = 0.2 +summary_TRIPAVG_trip_count = 1 +summary_TRIPAVG_range = 204 +summary_TRIPAVG_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/info = 47d +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/delta_distance = 37.1 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/kwh_charged = 6.3 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/kwh_discharged = -6.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/distance_unit_per_kwh = 5.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/kwh_per_100_distance_unit = 17.9 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/cost = 1.63 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/soc_avg = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/soc_min = 19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/soc_max = 100 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/battery12v_avg = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/battery12v_min = 76 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/battery12v_max = 95 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/charging_sessions = 0.4 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/trip_count = 1.9 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/DAYAVG/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_DAYAVG_date = 2023-02-19 +summary_DAYAVG_info = 47d +summary_DAYAVG_odometer = 23589.5 +summary_DAYAVG_delta_distance = 37.1 +summary_DAYAVG_kwh_charged = 6.3 +summary_DAYAVG_kwh_discharged = -6.6 +summary_DAYAVG_distance_unit_per_kwh = 5.6 +summary_DAYAVG_kwh_per_100_distance_unit = 17.9 +summary_DAYAVG_cost = 1.63 +summary_DAYAVG_soc = 57 +summary_DAYAVG_soc_avg = 57 +summary_DAYAVG_soc_min = 19 +summary_DAYAVG_soc_max = 100 +summary_DAYAVG_battery12v = 84 +summary_DAYAVG_battery12v_avg = 86 +summary_DAYAVG_battery12v_min = 76 +summary_DAYAVG_battery12v_max = 95 +summary_DAYAVG_charging_sessions = 0.4 +summary_DAYAVG_trip_count = 1.9 +summary_DAYAVG_range = 204 +summary_DAYAVG_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/info = 47d +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/delta_distance = 259.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/kwh_charged = 44.4 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/kwh_discharged = -46.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/distance_unit_per_kwh = 5.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/kwh_per_100_distance_unit = 17.9 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/cost = 11.44 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/soc_avg = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/soc_min = 19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/soc_max = 100 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/battery12v_avg = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/battery12v_min = 76 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/battery12v_max = 95 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/charging_sessions = 2.7 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/trip_count = 13.3 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/WEEKAVG/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_WEEKAVG_date = 2023-02-19 +summary_WEEKAVG_info = 47d +summary_WEEKAVG_odometer = 23589.5 +summary_WEEKAVG_delta_distance = 259.5 +summary_WEEKAVG_kwh_charged = 44.4 +summary_WEEKAVG_kwh_discharged = -46.5 +summary_WEEKAVG_distance_unit_per_kwh = 5.6 +summary_WEEKAVG_kwh_per_100_distance_unit = 17.9 +summary_WEEKAVG_cost = 11.44 +summary_WEEKAVG_soc = 57 +summary_WEEKAVG_soc_avg = 57 +summary_WEEKAVG_soc_min = 19 +summary_WEEKAVG_soc_max = 100 +summary_WEEKAVG_battery12v = 84 +summary_WEEKAVG_battery12v_avg = 86 +summary_WEEKAVG_battery12v_min = 76 +summary_WEEKAVG_battery12v_max = 95 +summary_WEEKAVG_charging_sessions = 2.7 +summary_WEEKAVG_trip_count = 13.3 +summary_WEEKAVG_range = 204 +summary_WEEKAVG_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/info = 47d +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/delta_distance = 1127.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/kwh_charged = 193.1 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/kwh_discharged = -202.0 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/distance_unit_per_kwh = 5.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/kwh_per_100_distance_unit = 17.9 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/cost = 49.70 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/soc_avg = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/soc_min = 19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/soc_max = 100 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/battery12v_avg = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/battery12v_min = 76 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/battery12v_max = 95 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/charging_sessions = 11.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/trip_count = 57.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/MONTHAVG/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_MONTHAVG_date = 2023-02-19 +summary_MONTHAVG_info = 47d +summary_MONTHAVG_odometer = 23589.5 +summary_MONTHAVG_delta_distance = 1127.6 +summary_MONTHAVG_kwh_charged = 193.1 +summary_MONTHAVG_kwh_discharged = -202.0 +summary_MONTHAVG_distance_unit_per_kwh = 5.6 +summary_MONTHAVG_kwh_per_100_distance_unit = 17.9 +summary_MONTHAVG_cost = 49.70 +summary_MONTHAVG_soc = 57 +summary_MONTHAVG_soc_avg = 57 +summary_MONTHAVG_soc_min = 19 +summary_MONTHAVG_soc_max = 100 +summary_MONTHAVG_battery12v = 84 +summary_MONTHAVG_battery12v_avg = 86 +summary_MONTHAVG_battery12v_min = 76 +summary_MONTHAVG_battery12v_max = 95 +summary_MONTHAVG_charging_sessions = 11.6 +summary_MONTHAVG_trip_count = 57.6 +summary_MONTHAVG_range = 204 +summary_MONTHAVG_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/date = 2023-02-19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/info = 47d +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/odometer = 23589.5 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/delta_distance = 13531.4 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/kwh_charged = 2317.3 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/kwh_discharged = -2424.4 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/distance_unit_per_kwh = 5.6 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/kwh_per_100_distance_unit = 17.9 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/cost = 596.40 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/soc = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/soc_avg = 57 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/soc_min = 19 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/soc_max = 100 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/battery12v = 84 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/battery12v_avg = 86 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/battery12v_min = 76 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/battery12v_max = 95 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/charging_sessions = 139.8 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/trip_count = 691.2 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/range = 204 +hyundai_kia_connect_monitor/KMHKR81CPNU012345/summary/YEARLY/address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" +summary_YEARLY_date = 2023-02-19 +summary_YEARLY_info = 47d +summary_YEARLY_odometer = 23589.5 +summary_YEARLY_delta_distance = 13531.4 +summary_YEARLY_kwh_charged = 2317.3 +summary_YEARLY_kwh_discharged = -2424.4 +summary_YEARLY_distance_unit_per_kwh = 5.6 +summary_YEARLY_kwh_per_100_distance_unit = 17.9 +summary_YEARLY_cost = 596.40 +summary_YEARLY_soc = 57 +summary_YEARLY_soc_avg = 57 +summary_YEARLY_soc_min = 19 +summary_YEARLY_soc_max = 100 +summary_YEARLY_battery12v = 84 +summary_YEARLY_battery12v_avg = 86 +summary_YEARLY_battery12v_min = 76 +summary_YEARLY_battery12v_max = 95 +summary_YEARLY_charging_sessions = 139.8 +summary_YEARLY_trip_count = 691.2 +summary_YEARLY_range = 204 +summary_YEARLY_address = "9;Kwakstraat; Duckstad; Nederland; 7054; AN" diff --git a/tests/run_monitor.bat b/tests/run_monitor.bat index 017e6c5..4d2c209 100644 --- a/tests/run_monitor.bat +++ b/tests/run_monitor.bat @@ -27,8 +27,8 @@ IF EXIST monitor.kml del /Q monitor.kml echo ################## copying INPUT ############# copy /Y tests\INPUT\* . -echo ################## python monitor.py ############# -call python monitor.py > test.monitor.log 2>&1 +echo ################## python monitor.py test ##### +call python monitor.py test > test.monitor.log 2>&1 type test.monitor.log echo ################## check manually differences with Beyond Compare #### diff --git a/tests/run_mypy.bat b/tests/run_mypy.bat new file mode 100644 index 0000000..9304400 --- /dev/null +++ b/tests/run_mypy.bat @@ -0,0 +1,19 @@ +@echo on +setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION + +IF not EXIST tests\run_mypy.bat ( + echo Run this script one directory higher: tests\run_mypy.bat + goto :error +) + +mypy monitor_utils.py +mypy mqtt_utils.py | egrep -v "^Found|paho.mqtt|: note:" +mypy domoticz_utils.py +mypy monitor.py | egrep -v "^Found|hyundai_kia_connect_api|paho.mqtt|: note:" +mypy summary.py | egrep -v "^Found|gspread|paho.mqtt|: note:" +mypy dailystats.py | egrep -v "^Found|gspread|paho.mqtt|: note:|: error: Argument 1 to .next." +mypy kml.py | egrep -v "^Success" +mypy shrink.py | egrep -v "^Success" +mypy debug.py | egrep -v "^Found|hyundai_kia_connect_api" + +pause \ No newline at end of file diff --git a/tests/run_tests.bat b/tests/run_tests.bat index 59548ed..16e2401 100644 --- a/tests/run_tests.bat +++ b/tests/run_tests.bat @@ -44,6 +44,10 @@ call :CHECK_DAILYSTATS "" test.dailystats.logday call :CHECK_SUMMARY sheetupdate test.summary.log call :CHECK_DAILYSTATS sheetupdate test.dailystats.log +call :CHECK_SUMMARY_MQTT_DOMOTICZ + +call :CHECK_DAILYSTATS_MQTT_DOMOTICZ + call :CHECK_TRANSLATIONS rem restore original monitor.cfg @@ -185,6 +189,31 @@ if "%args%" == "sheetupdate" ( ) EXIT /B +rem ####################### +:CHECK_SUMMARY_MQTT_DOMOTICZ +set args=debug trip day week month year +set output=test.summary.mqtt_domoticz.log + +echo ################## python summary.py %args% ^> %output% ############# +call python summary.py %args% | findstr "send_to_domoticz send_to_mqtt" | %SED% -e "s?^.*send_to_mqtt: ??" | %SED% -e "s?^.*send_to_domoticz: ??" > %output% + +call :CHECK_FILE %output% %output% + +EXIT /B + +rem ####################### +:CHECK_DAILYSTATS_MQTT_DOMOTICZ +set args=debug +set output=test.dailystats.mqtt_domoticz.log + +echo ################## python dailystats.py %args% ^> %output% ############# +call python dailystats.py %args% | findstr "send_to_domoticz send_to_mqtt" | %SED% -e "s?^.*send_to_mqtt: ??" | %SED% -e "s?^.*send_to_domoticz: ??" | %SED% -e "s?^dailystats_day_TOTALS_date =.*?dailystats_day_TOTALS_date =?" | %SED% -e "s?^hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/date =.*?hyundai_kia_connect_monitor/KMHKR81CPNU012345/dailystats_day/TOTALS/date =?" > %output% + +call :CHECK_FILE %output% %output% + +EXIT /B + + rem ####################### :CHECK_FILE set left=%1