kairostech-sw / kairoshub-configuration

0 stars 0 forks source link

[HM] CdU 1 - Accensione manuale riscaldamenti 2/3 #15

Closed mfinotti closed 2 years ago

mfinotti commented 2 years ago

Abstract

Il modulo appdaemon heatingManager è l'unico deputato alla gestione del sistema di riscaldamento e rimane in ascolto di specifici eventi.

Passi preliminari

E' necessario includere nel modulo tutte le entità necessarie alla corretta gestione delle funzionalità che si andranno a realizzare.

  1. Predisporre delle funzioni che dato il gruppo HEATING_VALVES ricuperi entità per entità le informazioni e le organizzi in una struttura dati ordinata. denominata valves Informazioni da recuperare / organizzare:
  • Temperatura corrente
  • Temperatura target
  • Posizione della valvola
  • Calcoli il topic base di riferimento a partire dal nome della entità del gruppo. Ad esempio, TV01_temp, topic calcolato shellyes/TV01/
  1. Predisporre una funzione che controlli se in quel momento ci sono programmi di riscaldamento già attivi
  2. Predisporre una funzione che ottenga lo stato della temperatura media della entità sensor.temperatura
  3. Predisporre una funzione che controlli se le valvole sono tutte chiuse
  4. Predisporre una funzione che faccia dispatch AD_MQTT_PUBLISH passando come valore il topic e il valore da pubblicare.
  5. Predisporre una funzione per il settaggio della temperatura target di una valvola

Accensione manuale riscaldamento

L'accensione manuale del riscaldamento viene triggerata dall'evento AD_HEATING_ON, questo evento è deputato alla gestione e controllo del riscaldamento attraverso la funzione handleHeatingOnEvent che ha il compito di aggregare le informazioni necessarie all'invocazione della funzione heatingOn

heatingOn function

La funzione in questione prende in input i seguenti parametri:

Logica di business

  1. Viene verificato se ci sono programmi già attivi, se c'è un programma attivo abbandona l'esecuzione. Altrimenti continua al punto 2
  2. Viene impostato il valore della targetTemperature che èpari a 32 per program=manual oppure è uguale al valore della entity temperatura target associata al programma in oggetto. Ad esempio ad esempio: input_number.temperature_period1 per prog1
  3. Viene richiamata la funzione per il settaggio della temperatura target per ogni valvola, passando il documento valve= valves[x] e value=targetTemperature
  4. Una volta richiamata la funzione per il settaggio della temperatura per ogni valvola il sistema si appresta a controllare lo stato di apertura delle valvole richiamando la apposita funzione. Se le valvole sono chiuse il sistema attende in un loop di 30 secondi e ritenta il controllo per un massimo di tre volte. Al terzo tentativo, se le valvole risultano ancora chiuse allora viene abbandonata l'esecuzione del comando. Altrimenti continua al punto successivo.
  5. Il sistema da il segnale di accensione alla caldaia.
  6. Viene inviata una notifica di accensione dei riscaldamenti
mfinotti commented 2 years ago

Non è stato possibile testare.

mfinotti commented 2 years ago

Sul programma 1,2 sembra tutto funzionare, invece sul 3 si verifica il seguente problema:

2022-09-27 22:49:00.073264 INFO heating_manager: Starting Program 1 2022-09-27 22:49:00.075429 INFO heating_manager: Checking if another program is on 2022-09-27 22:49:00.077725 INFO heating_manager: Checking the heating program state 2022-09-27 22:49:00.084451 INFO heating_manager: Program 1 is not active right now 2022-09-27 22:49:10.061791 INFO heating_manager: Starting Program 2 2022-09-27 22:49:10.063767 INFO heating_manager: Checking if another program is on 2022-09-27 22:49:10.066284 INFO heating_manager: Checking the heating program state 2022-09-27 22:49:10.072126 INFO heating_manager: Program 2 is not active right now 2022-09-27 22:49:20.060455 INFO heating_manager: Starting Program 3 2022-09-27 22:49:20.062630 INFO heating_manager: Checking if another program is on 2022-09-27 22:49:20.064986 INFO heating_manager: Checking the heating program state 2022-09-27 22:49:20.069202 WARNING heating_manager: ------------------------------------------------------------ 2022-09-27 22:49:20.070072 WARNING heating_manager: Unexpected error in worker for App heating_manager: 2022-09-27 22:49:20.072012 WARNING heating_manager: Worker Ags: {'id': '08e67de25694406dbeef17c770efbbab', 'name': 'heating_manager', 'objectid': 'ee749b85ef2343fea213489f8f051d26', 'type': 'event', 'event': 'HA_MANAGE_HEATER', 'function': <bound method HeatingManager.handleHeatingProgram of <heatingManager.HeatingManager object at 0xf55d2c70>>, 'data': {'program': 'prog3', 'temperature': 24.1, 'on_off_heater': 'on', 'target_temp': 25.0, 'on_off_time_monday': {'on_time': '00:00:00', 'off_time': '00:00:00'}, 'on_off_time_tuesday': {'on_time': '19:30:00', 'off_time': '00:35:00'}, 'on_off_time_wednesday': {'on_time': '00:00:00', 'off_time': '00:00:00'}, 'on_off_time_thursday': {'on_time': '00:00:00', 'off_time': '00:00:00'}, 'on_off_time_friday': {'on_time': '00:00:00', 'off_time': '00:00:00'}, 'on_off_time_saturday': {'on_time': '00:00:00', 'off_time': '00:00:00'}, 'on_off_time_sunday': {'on_time': '00:00:00', 'off_time': '00:00:00'}, 'metadata': {'origin': 'LOCAL', 'time_fired': '2022-09-27T20:49:20.044503+00:00', 'context': {'id': '095b3c3696605e583a6abd97f27b115e', 'parent_id': None, 'user_id': None}}}, 'pin_app': True, 'pin_thread': 1, 'kwargs': {'__thread_id': 'thread-1'}} 2022-09-27 22:49:20.073243 WARNING heating_manager: ------------------------------------------------------------ 2022-09-27 22:49:20.074789 WARNING heating_manager: Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/appdaemon/threading.py", line 936, in worker funcref(args["event"], data, self.AD.events.sanitize_event_kwargs(app, args["kwargs"])) File "/conf/apps/heatingManager.py", line 48, in handleHeatingProgram on_time,off_time,status=self.getProgramSchedule(progID, data) File "/conf/apps/heatingManager.py", line 160, in getProgramSchedule self.setProgramSchedule(progID, kwargs) File "/conf/apps/heatingManager.py", line 185, in setProgramSchedule off_time=datetime.strptime(nextdate+off_time,"%Y-%m-%dT%H:%M:%S") TypeError: can only concatenate str (not "datetime.datetime") to str

2022-09-27 22:49:20.076376 WARNING heating_manager: ------------------------------------------------------------

Il file generato dall'applicazione appare nel modo seguente:

{"status": "running", "prog1": {"on_time": "2022-09-27T10:00:00", "off_time": "2022-09-27T11:00:00", "status": "not running"}, "prog2": {"on_time": "2022-09-27T18:25:00", "off_time": "2022-09-27T18:45:00", "status": "not running"}, "prog3": {"on_time": "1900-01-01T00:00:00", "off_time": "1900-01-01T00:00:00"}, "prog4": {"on_time": "1900-01-01T00:00:00", "off_time": "1900-01-01T00:00:00"}}

lo status è correttamente RUNNINGanche se il riscaldamento risulta spento. Programma 3, martedì accensione: 19:40, spegnimento: 00:30

mfinotti commented 2 years ago

Modificando i valori per programma 1, e 2, si ottiene lo stesso errore di prima, situazione senza uscita.