Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Questo codice è rilasciato sotto la licenza MIT.
- *
- * Copyright (c) [2024-2025] [ClaudioG]
- *
- * Youtube channel: https://www.youtube.com/@claudiog_4_hydroponic
- *
- * Con la presente si concede il permesso, gratuitamente, a chiunque ottenga una copia
- * di questo software e dei file di documentazione associati (il "Software"),
- * di utilizzare il Software senza restrizioni, inclusi, a titolo esemplificativo ma non esaustivo,
- * i diritti di usare, copiare, modificare, unire, pubblicare, distribuire, concedere in sublicenza
- * e/o vendere copie del Software, e di permettere alle persone a cui il Software è fornito
- * di farlo, nel rispetto delle seguenti condizioni:
- *
- * L'avviso di copyright sopra riportato e questo avviso di autorizzazione devono essere
- * inclusi in tutte le copie o porzioni sostanziali del Software.
- *
- * IL SOFTWARE VIENE FORNITO "COSÌ COM'È", SENZA GARANZIA DI ALCUN TIPO,
- * ESPRESSA O IMPLICITA, INCLUSE, MA NON SOLO, LE GARANZIE DI COMMERCIABILITÀ,
- * IDONEITÀ PER UNO SCOPO PARTICOLARE E NON VIOLAZIONE. IN NESSUN CASO GLI AUTORI
- * O I TITOLARI DEL COPYRIGHT SARANNO RESPONSABILI PER QUALSIASI RECLAMO, DANNO
- * O ALTRA RESPONSABILITÀ, SIA IN UN'AZIONE CONTRATTUALE, ILLECITO O ALTRO,
- * DERIVANTE DA, DA O IN CONNESSIONE CON IL SOFTWARE O L'USO O ALTRI
- * RAPPORTI NEL SOFTWARE.
- *
- * Nota: Questo codice è stato sviluppato specificamente per l'ESP32.
- */
- /*
- * This code is released under the MIT License.
- *
- * Copyright (c) [2024-2025] [ClaudioG]
- *
- * YouTube channel: https://www.youtube.com/@claudiog_4_hydroponic
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the Software
- * is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Note: This code has been specifically developed for the ESP32.
- */
- esphome:
- name: centralinapostazioneidroponica8 # Massimo 31 caratteri
- friendly_name: "Centralina per la gestione dei dispositivi domotici della piattaforma idroponica 8"
- # AL FINE DI EVITARE CHE I SENSORI LATO HA SIANO IN ERRORE A CAUSA DELLA MANCANZA DEL VALORE, SI ASSEGNA AL BOOT IL VALORE 0
- on_boot:
- priority: 800 # Si esegue all'avvio con priorità ALTA https://esphome.io/components/esphome.html#on-boot
- then:
- - sensor.template.publish:
- id: lastricosolare_valoretemperaturaponderatasoluzionefertilizzantepostazioneidroponica8
- state: 0.0
- - sensor.template.publish:
- id: lastricosolare_valorephponderatosoluzionefertilizzantepostazioneidroponica8
- state: 0.0
- - sensor.template.publish:
- id: lastricosolare_valoretdsponderatosoluzionefertilizzantepostazioneidroponica8
- state: 0.0
- - sensor.template.publish:
- id: lastricosolare_conducibilitasoluzionefertilizzantepostazioneidroponica8
- state: 0.0
- esp32:
- board: esp32dev
- framework:
- type: arduino
- wifi:
- networks:
- - ssid: !secret eolo_ssid
- password: !secret eolo_wpa
- - ssid: !secret iliad_ssid
- password: !secret iliad_wpa
- - ssid: !secret wind3_ssid
- password: !secret wind3_wpa
- manual_ip: # https://esphome.io/components/wifi.html#manual-ips
- static_ip: 192.168.0.127
- gateway: 192.168.0.1
- subnet: 255.255.255.0
- dns1: 8.8.8.8
- dns2: 8.8.4.4
- reboot_timeout: 1min # se ESP32 non si connette al wifi per 1 minuto, si riavvia
- power_save_mode: none # https://esphome.io/components/wifi.html#power-save-mode
- output_power: 20
- on_connect:
- then:
- - globals.set:
- id: sono_connesso_al_wifi
- value: 'true'
- on_disconnect:
- then:
- - globals.set:
- id: sono_connesso_al_wifi
- value: 'false'
- ap:
- ssid: !secret esp32_postazione_idroponica_8_fallback_ssid
- password: !secret esp32_postazione_idroponica_8_fallback_password
- captive_portal:
- api:
- encryption:
- key: !secret esp32_postazione_idroponica_8_api_encryption
- ota:
- - platform: esphome
- password: !secret esp32_postazione_idroponica_8_ota_password
- logger:
- level: DEBUG
- web_server:
- port: 80
- one_wire:
- - platform: gpio
- pin: GPIO4
- time:
- - platform: homeassistant
- id: homeassistant_time
- switch:
- - platform: gpio
- pin: GPIO16
- name: "Pompa acido postazione idroponica 8"
- icon: mdi:water-pump
- - platform: gpio
- pin: GPIO17
- name: "Pompa fertilizzante postazione idroponica 8"
- icon: mdi:water-pump
- ###########################################################################################################
- # SENSORI DA DICHIARARE IN HOME ASSISTANT PER IL CORRETTO FUNZIONAMENTO DI QUESTA SKILL #
- # #
- # - input_number.lastricosolare_valorecompensazionetemperaturasoluzionefertilizzantepostazioneidroponica8 #
- # - input_number.lastricosolare_valorecompensazionephgrezzosoluzionefertilizzantepostazioneidroponica8 #
- # - input_number.lastricosolare_valorecompensazionetdspostazioneidroponica8 #
- # #
- ###########################################################################################################
- globals:
- ###################################################################################################
- # VARIABILI GLOBALI #
- # #
- # Sono variabili che mantengono il loro valore attuale anche quando l'ESP32 viene riavviato. #
- # Possono inoltre essere gestite all'interno di lambda diverse da quella in cui sono state create #
- # Se hanno l'attributo restore_value: true al riavvio riprendono il valore initial_value: #
- # #
- ###################################################################################################
- ###########################################################
- # VARIABILI CREATE AD ESCLUSIVO USO E CONSUMO DELL'UTENTE #
- ###########################################################
- ################################################################################################################
- # DETERMINAZIONE DEL VALORE DI SOGLIA TRA LE 10 MISURAZIONI #
- # IL MIO GOAL E' IMPOSTARE UN VALORE LIMITE DI ±0,5 pH DALLA MEDIA DEI VALORI #
- # QUESTO SIGNIFICA CHE TUTTI I VALORI CHE AVRANNO UN VALORE ±0,5 pH RISPETTO ALLA LORO MEDIA SARANNO SCARTATI. #
- # QUESTA VARIABILE LAVORA PERO' IN VOLT. QUINDI DOBBIAMO FARE LA FORMULA INVERSA DELLA LEGGE DI NERNST #
- # 0,5pH × 0,059 V/pH =0,0295V #
- # SAPPIAMO CHE LA TENSIONE DI RIFERIMENTO E' 2,5V (PER pH 7), QUINDI LA SOGLIA DI ERRORE % SARA': #
- # 0.0295V / 2,5V = 0.0118V #
- ################################################################################################################
- - id: soglia_errore_massimo_ammesso_singola_lettura_grezza
- type: float
- restore_value: true
- initial_value: '0.0118'
- #################################################################################################################
- # DETERMINAZIONE DEL VALORE DI SOGLIA TRA 2 MISURAZIONI SUCCESSIVE #
- # IL MIO GOAL E' IMPOSTARE UN VALORE LIMITE DI ±1 pH RISPETTO ALLA MISURAZIONE PRECEDENTE #
- # QUESTO SIGNIFICA CHE SE IL VALORE DEL NUOVO PH E' ±1 pH RISPETTO A QUELLO DEL GIRO PRECEDENTE SARA' SCARTATO. #
- # QUESTA VARIABILE LAVORA PERO' IN VOLT. QUINDI DOBBIAMO FARE LA FORMULA INVERSA DELLA LEGGE DI NERNST #
- # 1 pH × 0,059 V/pH =0,059V #
- # SAPPIAMO CHE LA TENSIONE DI RIFERIMENTO E' 2,5V (PER pH 7), QUINDI LA SOGLIA DI ERRORE SARA': #
- # 0.059V / 2,5V = 0.0236V #
- #################################################################################################################
- - id: soglia_differenza_nuova_lettura_grezza_ammessa_ph
- type: float
- restore_value: true
- initial_value: '0.0236'
- #################################################################################################################
- # DETERMINAZIONE DEL VALORE DI SOGLIA TRA LE 10 MISURAZIONI DI TDS #
- # IL MIO GOAL E' IMPOSTARE UN VALORE LIMITE DI ±100 ppm DALLA MEDIA DEI VALORI #
- # QUESTO SIGNIFICA CHE TUTTI I VALORI CHE AVRANNO UN VALORE ±100 ppm RISPETTO ALLA LORO MEDIA SARANNO SCARTATI. #
- # QUESTA VARIABILE LAVORA PERO' IN VOLT. QUINDI DOBBIAMO FARE QUESTO CALCOLO: #
- # IL MIO STRUMENTO HA UN INTERVALLO DI MISURAZIONE TDS: 0 ~ 1000ppm E UN SEGNALE DI USCITA: 0 ~ 2.3V #
- # QUINDI TENSIONE(V)= (TDS(ppm)/1000(ppm))*2,3 ==> 100/1000*2,3 ==> 0,23V #
- #################################################################################################################
- - id: soglia_errore_massimo_ammesso_singola_lettura_grezza_tds
- type: float
- restore_value: true
- initial_value: '0.23'
- #############################################################################################################
- # DETERMINAZIONE DEL VALORE DI SOGLIA TRA 2 MISURAZIONI SUCCESSIVE DI TDS #
- # IL MIO GOAL E' IMPOSTARE UN VALORE LIMITE DI ±500 ppm RISPETTO ALLA MISURAZIONE PRECEDENTE #
- # QUESTO SIGNIFICA CHE SE IL NUOVO VALORE E' ±500 ppm RISPETTO A QUELLO DEL GIRO PRECEDENTE SARA' SCARTATO. #
- # QUESTA VARIABILE LAVORA PERO' IN VOLT. QUINDI DOBBIAMO FARE QUESTO CALCOLO: #
- # IL MIO STRUMENTO HA UN INTERVALLO DI MISURAZIONE TDS: 0 ~ 1000ppm E UN SEGNALE DI USCITA: 0 ~ 2.3V #
- # QUINDI TENSIONE(V)= (TDS(ppm)/1000(ppm))*2,3 ==> 500/1000*2,3 ==> 1,15V #
- #############################################################################################################
- - id: soglia_differenza_nuova_lettura_grezza_ammessa_tds
- type: float
- restore_value: true
- initial_value: '1.15'
- #############################################################################################################
- # FATTORE DI CONVERSIONE DA TDS A CONDUCIBILITA' #
- # IN GIRO HO TROVATO UN SACCO DI COSTANTI QUANTITATIVAMENTE DIVERSE LE UNE DALLE ALTRE #
- # #
- # SUGGERISCO QUINDI DI PRENDERE LA PROPRIA PENNETTA, METTERLA IN UN BICCHIERE D'ACQUA, FARE STABILIZZARE #
- # LA LETTURA DEL TDS, CAMBIARE LA VISUALIZZAZIONE DELLO STRUMENTO IN EC E POI FARE IL RAPPORTO: #
- # TDS (ppm)/EC(µS/cm) E METTERE IL RISULTATO NELLA VARIABILE QUA SOTTO #
- #############################################################################################################
- - id: fattore_conversione_tds_conducibilita
- type: float
- restore_value: true
- initial_value: '0.5'
- #######################################################################
- # DETERMINAZIONE DELLA SENZIBILITA' DELLA CELLA DI CARICO #
- # AL FINE DI AVERE LETTURE PIU' STABILI E MENO INFLUENZATE DAL RUMORE #
- # DEFINISCI QUI LA SENSIBILITA' DELLA CELLA DI CARICO IN KG # #
- # E LA SUA CAPACITA' MASSIMA #
- #######################################################################
- - id: sensibilita_cella_di_carico
- type: int
- restore_value: true
- initial_value: '1'
- - id: capacita_massima_vasca
- type: int
- restore_value: true
- initial_value: '50'
- - id: sono_connesso_al_wifi
- type: bool
- restore_value: true
- initial_value: 'true'
- ######################
- # VARIABILI TECNICHE #
- ######################
- - id: nuovo_valore_ph_grezzo_processato
- type: float
- restore_value: true
- initial_value: '0.0'
- - id: nuovo_valore_tds_grezzo_processato
- type: float
- restore_value: true
- initial_value: '0'
- - id: offset_tara_cella_di_carico
- type: int
- restore_value: false
- initial_value: '0'
- button:
- - platform: restart
- name: "Forza riavvio ESP-32 postazione idroponica 8"
- icon: "mdi:restart"
- - platform: template
- name: "Tara cella di carico"
- icon: "mdi:button-pointer"
- on_press:
- then:
- - lambda: |-
- id(offset_tara_cella_di_carico) = id(lastricosolare_volumedellasoluzionefertilizzantepostazioneidroponica8).state; // Sostituisci 1000.0 con il valore di offset desiderato
- ESP_LOGI("Cella di carico", "Impostata manualmente la tara a: %dKg", id(offset_tara_cella_di_carico));
- sensor:
- #####################################################################################
- # SENSORI NECESSARI PER IMPORTARE I VALORI DEI SENSORI DA HOME ASSISTANT IN ESPHOME #
- #####################################################################################
- - platform: homeassistant
- name: "Valore di compensazione della temperatura proveniente da Home Assistant per la postazione idroponica 8"
- id: ha_compensazionetemperaturasoluzionefertilizzantepostazioneidroponica8
- entity_id: input_number.lastricosolare_valorecompensazionetemperaturasoluzionefertilizzantepostazioneidroponica8
- accuracy_decimals: 1
- on_value: # Se cambio il valore della compensazione, cambia subito il valore visualizzato
- then:
- lambda: |-
- if (id(ha_compensazionetemperaturasoluzionefertilizzantepostazioneidroponica8).has_state()) { // solo se ha un valore valido
- id(lastricosolare_valoretemperaturaponderatasoluzionefertilizzantepostazioneidroponica8).publish_state(id(lastricosolare_temperaturagrezzasoluzionefertilizzantepostazioneidroponica8).state + id(ha_compensazionetemperaturasoluzionefertilizzantepostazioneidroponica8).state);
- }
- - platform: homeassistant
- name: "Valore di compensazione del pH proveniente da Home Assistant per la postazione idroponica 8"
- id: ha_compensazionephsoluzionefertilizzantepostazioneidroponica8
- entity_id: input_number.lastricosolare_valorecompensazionephgrezzosoluzionefertilizzantepostazioneidroponica8
- accuracy_decimals: 1
- on_value: # Se cambio il valore della compensazione, cambia subito il valore visualizzato
- then:
- lambda: |-
- if (id(ha_compensazionephsoluzionefertilizzantepostazioneidroponica8).has_state()) { // solo se ha un valore valido
- id(lastricosolare_valorephponderatosoluzionefertilizzantepostazioneidroponica8).publish_state(id(nuovo_valore_ph_grezzo_processato) + id(ha_compensazionephsoluzionefertilizzantepostazioneidroponica8).state);
- }
- - platform: homeassistant
- name: "Valore di compensazione del TDS proveniente da Home Assistant per la postazione idroponica 8"
- id: ha_compensazionetdssoluzionefertilizzantepostazioneidroponica8
- entity_id: input_number.lastricosolare_valorecompensazionetdsgrezzosoluzionefertilizzantepostazioneidroponica8
- accuracy_decimals: 0
- on_value: # Se cambio il valore della compensazione, cambia subito il valore visualizzato
- then:
- lambda: |-
- if (id(ha_compensazionetdssoluzionefertilizzantepostazioneidroponica8).has_state()) { // solo se ha un valore valido
- id(lastricosolare_valoretdsponderatosoluzionefertilizzantepostazioneidroponica8).publish_state(id(nuovo_valore_tds_grezzo_processato) + id(ha_compensazionetdssoluzionefertilizzantepostazioneidroponica8).state);
- }
- ##############################
- # SENSORI PROPRI DELL'ESP-32 #
- ##############################
- - platform: wifi_signal
- id: intensita_segnale_wifi
- name: "Intensità del segnale WiFi"
- update_interval: 300s
- icon: "mdi:wifi"
- device_class: "signal_strength"
- state_class: "measurement"
- accuracy_decimals: 1
- - platform: dallas_temp
- name: "Valore grezzo della temperatura della soluzione fertilizzante nella postazione idroponica 8"
- id: lastricosolare_temperaturagrezzasoluzionefertilizzantepostazioneidroponica8
- update_interval: 5min
- internal: true # questo sensore non verrà esportato in home assistant
- #unit_of_measurement: "°C"
- #icon: "mdi:thermometer-water"
- #device_class: "temperature"
- #state_class: "measurement"
- accuracy_decimals: 1
- - platform: adc
- id: valore_ph_grezzo
- name: "Valore pH grezzo"
- pin: GPIO34
- update_interval: 30s
- internal: true
- accuracy_decimals: 3
- attenuation: 12db # https://esphome.io/components/sensor/adc.html#adc-esp32-attenuation
- on_value:
- then:
- - lambda: |-
- static float buffer_letture_V_ph[10]; // Buffer con 10 posizioni
- static int indice_buffer_ph = 0; // Indice corrente nel buffer
- static bool buffer_pieno_ph = false; // Flag per indicare se il buffer è stato riempito
- static float ultimo_valore_V_grezza_processato_ph = 0; // Inizializza la variabile contenente la lettura di tensione precedente (o la prima del ciclo) a quella in corso
- static float nuovo_valore_V_grezza_processato_ph = 0; // Inizializza la variabile contenente la nuova lettura di tensione
- static int conteggio_cicli_con_valore_ph_tutti_fuori_media = 0; // Inizializza la variabile che conta le volte che lo strumento non può dare un output perchè tutti i valori misurati sono fuori media
- static int conteggio_cicli_con_valore_ph_fuori_media = 0; // Inizializza la variabile che conta le volte che lo strumento non può dare un output aggiornato perchè il valore ponderato è fuori media
- // Resetta a 0 il valore di tutte le 10 posizioni del buffer quando deve riiniziare il giro
- if (buffer_pieno_ph) {
- for (int i = 0; i < 10; i++) {
- buffer_letture_V_ph[i] = 0.0; // Reset di tutte le posizioni a 0
- }
- buffer_pieno_ph = false;
- indice_buffer_ph = 0;
- }
- // Inserisce la nuova lettura grezza nel buffer
- buffer_letture_V_ph[indice_buffer_ph] = id(valore_ph_grezzo).state;
- // Incrementa l'indice per la prossima lettura, riavvolge a 0 quando arriva a 10 azzerando l'array'
- indice_buffer_ph++;
- if (indice_buffer_ph >= 10) {
- buffer_pieno_ph = true;
- // Log dello stato del buffer
- ESP_LOGI("pHmetro", "STATO ATTUALE DEL BUFFER:");
- for (int i = 0; i < 10; i++) {
- ESP_LOGI("pHmetro", "Posizione n° %d: Valore: %.3f V", i, buffer_letture_V_ph[i]);
- }
- ///////////////////////////////////////////////////////////////
- // CONTROLLO RISPETTO TOLLERANZA DI SOGLIA FRA LE 10 LETTURE //
- ///////////////////////////////////////////////////////////////
- // Calcolo della media provvisoria
- float somma_valori_V_grezze_ph = 0;
- for (int i = 0; i < 10; i++) {
- somma_valori_V_grezze_ph += buffer_letture_V_ph[i];
- }
- float media_provvisoria_V_grezze_ph = somma_valori_V_grezze_ph / 10;
- // Calcolo valore assoluto del fuori soglia per la lettura del pH grezzo
- float soglia_di_scarto_V_grezze_ph = media_provvisoria_V_grezze_ph * id(soglia_errore_massimo_ammesso_singola_lettura_grezza);
- ESP_LOGI("pHmetro","CONTROLLO DEL RISPETTO DELLA TOLLERANZA DI SOGLIA FRA LE 10 LETTURE");
- ESP_LOGI("pHmetro", "Essendo la soglia di scarto calcolata di ±%.3f V e la media delle 10 misurazioni di %.3f V,", soglia_di_scarto_V_grezze_ph, media_provvisoria_V_grezze_ph);
- ESP_LOGI("pHmetro", "rimangono solamente questi valori validi:");
- // Calcolo finale della media ponderata escludendo valori fuori soglia
- somma_valori_V_grezze_ph = 0;
- int conteggio_valori_V_in_soglia_ph = 0;
- ESP_LOGI("pHmetro","Valori utilizzabili rimasti:");
- for (int i = 0; i < 10; i++) {
- if (fabs(buffer_letture_V_ph[i] - media_provvisoria_V_grezze_ph) <= soglia_di_scarto_V_grezze_ph) { //fabs= valore assoluto
- ESP_LOGI("pHmetro", "Posizione n° %d: Valore: %.3f V", i, buffer_letture_V_ph[i]);
- somma_valori_V_grezze_ph += buffer_letture_V_ph[i];
- conteggio_valori_V_in_soglia_ph++;
- }
- }
- if (conteggio_valori_V_in_soglia_ph == 0) {
- ESP_LOGI("pHmetro", " NESSUNO!!");
- }
- // a questo punto somma_valori_V_grezze_ph conterrà la somma dei SOLI valori in soglia in numero quantificati dalla variabile conteggio_valori_V_in_soglia_ph
- if (fabs(ultimo_valore_V_grezza_processato_ph) > 0.0001) { // Non primo giro N.B. utilizzato fabs e il numero float a causa delle piccole grandezze in gioco
- if (conteggio_valori_V_in_soglia_ph > 0) { // Se c'è almeno un valore valido, calcola la media
- conteggio_cicli_con_valore_ph_tutti_fuori_media = 0; // Resetta il contatore dei cicli fuori media perchè devono essere CONSECUTIVI
- // Calcola il nuovo valore processato
- nuovo_valore_V_grezza_processato_ph = somma_valori_V_grezze_ph / conteggio_valori_V_in_soglia_ph;
- ESP_LOGI("pHmetro", "Ultimo valore grezzo processato: %.3f V ==> Nuovo valore grezzo processato: %.3f V",ultimo_valore_V_grezza_processato_ph , nuovo_valore_V_grezza_processato_ph);
- } else {
- ESP_LOGI("pHmetro", "Numero di volte che TUTTE le letture vengono calcolate fuori soglia: %d", (conteggio_cicli_con_valore_ph_tutti_fuori_media + 1));
- conteggio_cicli_con_valore_ph_tutti_fuori_media++; // Incrementa il contatore di cicli fuori media
- if (conteggio_cicli_con_valore_ph_tutti_fuori_media == 5) {
- ESP_LOGI("pHmetro", "Superati i 5 cicli con tutte le letture fuori media!");
- id(invia_notifica_superati_5_cicli_consecutivi_di_letture_fuori_media_ph).execute(); //Manda la notifica sul cellulare
- conteggio_cicli_con_valore_ph_tutti_fuori_media = 0; // Reset della variabile
- nuovo_valore_V_grezza_processato_ph = media_provvisoria_V_grezze_ph; // Prende per buono il valore grezzo medio
- ESP_LOGI("pHmetro", "Utilizzato come valore di fallback il valore grezzo medio: %.3f V", nuovo_valore_V_grezza_processato_ph);
- } else {
- nuovo_valore_V_grezza_processato_ph = ultimo_valore_V_grezza_processato_ph; // Ripropone la misurazione grezza precedente
- ESP_LOGI("pHmetro", "Utilizzato come valore di fallback la misurazione grezza precedente: %.3f V", nuovo_valore_V_grezza_processato_ph);
- }
- }
- } else {
- ESP_LOGI("pHmetro", "Questo è il primo giro della giostra!!");
- ESP_LOGI("pHmetro", "Utilizzato il valore della media provvisoria grezza: %.3f V", media_provvisoria_V_grezze_ph);
- nuovo_valore_V_grezza_processato_ph = media_provvisoria_V_grezze_ph; // Prende il valore grezzo medio, non avendo, allo stato, altri dati a disposizione
- }
- ///////////////////////////////////////////////////////////////////////
- // CONTROLLO RISPETTO TOLLERANZA DI SOGLIA CON LA LETTURA PRECEDENTE //
- ///////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- // DA NON FARE NEL PERIODO TRA IL RABBOCCO E LA PRIMA IRRIGAZIONE //
- ///////////////////////////////////////////////////////////////////////
- auto now = id(homeassistant_time).now(); // Ottieni l'orario corrente
- if (now.hour >= 3 && now.hour < 6) {
- ESP_LOGI("pHmetro", "FASCIA ORARIA INERDETTA AL CONTROLLO DEL RISPETTO DELLA SOGLIA CON LA LETTURA PRECEDENTE.");
- } else {
- ESP_LOGI("pHmetro","CONTROLLO DEL RISPETTO DELLA TOLLERANZA DI SOGLIA FINALE");
- ESP_LOGI("pHmetro", "Ultimo valore grezzo processato: %.3f V ==> Nuovo valore grezzo processato: %.3f V",ultimo_valore_V_grezza_processato_ph , nuovo_valore_V_grezza_processato_ph);
- if (fabs(ultimo_valore_V_grezza_processato_ph) > 0.0001) { // Non primo giro N.B. utilizzato fabs e il numero float a causa delle piccole grandezze in gioco
- ESP_LOGI("pHmetro", "Valore di scarto %.3f V Soglia impostata: %.3f V", fabs(nuovo_valore_V_grezza_processato_ph - ultimo_valore_V_grezza_processato_ph) / ultimo_valore_V_grezza_processato_ph, id(soglia_differenza_nuova_lettura_grezza_ammessa_ph));
- if ((fabs(nuovo_valore_V_grezza_processato_ph - ultimo_valore_V_grezza_processato_ph) / ultimo_valore_V_grezza_processato_ph) > id(soglia_differenza_nuova_lettura_grezza_ammessa_ph)) { //Soglia NON rispettata)
- ESP_LOGI("pHmetro", "Il nuovo valore misurato è fuori dalla soglia impostata rispetto al valore precedente!!");
- ESP_LOGI("pHmetro", "Numero di volte che il valore viene calcolato fuori soglia: %d", conteggio_cicli_con_valore_ph_fuori_media + 1);
- conteggio_cicli_con_valore_ph_fuori_media++; // incrementa valore letture fuori media
- if (conteggio_cicli_con_valore_ph_fuori_media == 5) {
- ESP_LOGI("pHmetro", "Superati i 5 cicli con la lettura fuori media!");
- id(invia_notifica_superati_5_cicli_consecutivi_di_letture_fuori_media_ph).execute(); //Manda la notifica sul cellulare
- conteggio_cicli_con_valore_ph_fuori_media = 0; // resetta la variabile
- // fa passare il valore attuale di nuovo_valore_V_grezza_processato_ph
- } else {
- nuovo_valore_V_grezza_processato_ph = ultimo_valore_V_grezza_processato_ph;
- ESP_LOGI("pHmetro", "Utilizzato come valore di fallback la misurazione grezza precedente: %.3f V", nuovo_valore_V_grezza_processato_ph); // Fa passare il valore precedente)
- }
- } else {
- ESP_LOGI("pHmetro", "Il nuovo valore misurato %.3f V rientra nella soglia impostata rispetto al valore precedente.", nuovo_valore_V_grezza_processato_ph);
- conteggio_cicli_con_valore_ph_fuori_media = 0; // resetta la variabile perchè i cicli devono essere CONSECUTIVI
- }
- } else {
- ESP_LOGI("pHmetro", "Questo è il primo giro della giostra!!");
- ESP_LOGI("pHmetro", "Utilizzato la misurazione grezza attuale: %.3f V", nuovo_valore_V_grezza_processato_ph);
- }
- }
- ESP_LOGI("pHmetro", "Ultimo valore grezzo processato: %.3f V ==> Nuovo valore grezzo processato: %.3f V",ultimo_valore_V_grezza_processato_ph , nuovo_valore_V_grezza_processato_ph);
- ultimo_valore_V_grezza_processato_ph = nuovo_valore_V_grezza_processato_ph;
- /////////////////////////////////////////////////////////////////////////////////////
- // TRASFORMAZIONE DEI VOLT IN pH //
- // NEL NOSTRO CONTESTO DI FUNZIONAMENTO DEL pHMETRO (pH= 0 ==> 0V E pH= 14 ==> 5V) //
- // DOBBIAMO CALCOLARE LA VARIAZIONE ∆V RISPETTO AL pH CON LA SEGUENTE FORMULA: //
- // ∆V = (5V - 0 V) / 14 = 0,357 //
- // DATO CHE SAPPIAMO CHE A pH= 7 LA TENSIONE E' DI 2,5 V //
- // E DATO CHE VOGLIAMO UTILIZZARE UNA SCALA LINEARE DEI VALORI V E pH //
- // LA FORMULA COMUNEMENTE USATA PER I pHMETRI COMMERCIALI E' LA SEGUENTE: //
- // 2,5 - Vmisurata //
- // pH = 7.0 - ------------------ //
- // 0,357 //
- /////////////////////////////////////////////////////////////////////////////////////
- ESP_LOGI("pHmetro", "Ultimo valore in tensione: %.3f V ",nuovo_valore_V_grezza_processato_ph);
- // Calcola il pH basato sull'ultima lettura grezza
- id(nuovo_valore_ph_grezzo_processato) = (7.0 - ((2.5 - nuovo_valore_V_grezza_processato_ph) / 0.357));
- ESP_LOGI("pHmetro", "Valore pH calcolato: %.3f ",id(nuovo_valore_ph_grezzo_processato));
- /////////////////////////////////////////////////////////////////////////////////////////////////
- // PONDERAZIONE DEL VALORE DEL pH IN RELAZIONE ALLA TEMPERATURA DEL FLUIDO //
- // LA TEMPERATURA INFLUISCE SULL'ATTIVITA' IONICA DELLE SOLUZIONI E GLI ELETTRODI DEL pH SONO //
- // SENSIBILI ALLA TEMPERATURA PERCHE' LA MISURA DEL POTENZIALE ELETTRICO GENERATO VARIA IN //
- // FUNZIONE DELLA TEMPERATURA DELLA SOLUZIONE, IN ACCORDO CON L'EQUAZIONE DI NERNST //
- // LA FORMULA CORRENTEMENTE UTILIZZATA E': //
- // pHcompensato= pHmisurato + ((Triferimento-Tattuale) * fattore di compensazione) //
- // DOVE: Triferimento= 25° e fattore di compensazione = 0,03 (VALORE EMPIRICO DI USO COMUNE) //
- /////////////////////////////////////////////////////////////////////////////////////////////////
- if (id(lastricosolare_valoretemperaturaponderatasoluzionefertilizzantepostazioneidroponica8).has_state()) { // solo se ha un valore valido
- id(nuovo_valore_ph_grezzo_processato) += ((25 - id(lastricosolare_valoretemperaturaponderatasoluzionefertilizzantepostazioneidroponica8).state) * 0.03);
- ESP_LOGI("pHmetro", "Valore pH ponderato con la temperatura: %.3f Temperatura rilevata: %.1f°C", id(nuovo_valore_ph_grezzo_processato), id(lastricosolare_valoretemperaturaponderatasoluzionefertilizzantepostazioneidroponica8).state);
- } else {
- ESP_LOGI("pHmetro", "ATTENZIONE !! Valore pH NON ponderato con la temperatura il cui valore non è allo stato disponibile.");
- }
- // AGGIUNGE IL VALORE DI COMPENSAZIONE PROVENIENTE DA HOME ASSISTANT
- if (id(ha_compensazionephsoluzionefertilizzantepostazioneidroponica8).has_state()) { // solo se ha un valore valido
- id(nuovo_valore_ph_grezzo_processato) += id(ha_compensazionephsoluzionefertilizzantepostazioneidroponica8).state;
- ESP_LOGI("pHmetro", "Valore pH ponderato con Home Assistant: %.3f Valore correttivo: %.1f",id(nuovo_valore_ph_grezzo_processato),id(ha_compensazionephsoluzionefertilizzantepostazioneidroponica8).state);
- }
- // Verifica che il pH sia valido
- if (isnan(id(nuovo_valore_ph_grezzo_processato)) || id(nuovo_valore_ph_grezzo_processato) < 0.0 || id(nuovo_valore_ph_grezzo_processato) > 14.0) {
- ESP_LOGW("pHmetro", "Valore pH non valido: %.1f", id(nuovo_valore_ph_grezzo_processato));
- id(lastricosolare_valorephponderatosoluzionefertilizzantepostazioneidroponica8).publish_state(id(lastricosolare_valorephponderatosoluzionefertilizzantepostazioneidroponica8).state); // Pubblica il valore precendete
- } else {
- ESP_LOGI("pHmetro", "Valore pH reale: %.1f ",id(nuovo_valore_ph_grezzo_processato));
- id(lastricosolare_valorephponderatosoluzionefertilizzantepostazioneidroponica8).publish_state(id(nuovo_valore_ph_grezzo_processato)); // Pubblica il valore corretto
- }
- }
- - platform: adc
- pin: GPIO35
- id: valore_tds_grezzo
- name: "Valore TDS grezzo"
- update_interval: 30s
- internal: true
- accuracy_decimals: 0
- attenuation: 12db
- on_value:
- then:
- - lambda: |-
- static float buffer_letture_V_tds[10]; // Buffer con 10 posizioni
- static int indice_buffer_tds = 0; // Indice corrente nel buffer
- static bool buffer_pieno_tds = false; // Flag per indicare se il buffer è stato riempito
- static float ultimo_valore_V_grezza_processato_tds = 0; // Inizializza la variabile contenente la lettura precedente (o la prima del ciclo) a quella in corso
- static float nuovo_valore_V_grezza_processato_tds = 0; // Inizializza la variabile contenente la nuova lettura di tensione
- static int conteggio_cicli_con_valore_tds_tutti_fuori_media = 0; // Inizializza la variabile che conta le volte che lo strumento non può dare un output perchè tutti i valori misurati sono fuori media
- static int conteggio_cicli_con_valore_tds_fuori_media = 0; // Inizializza la variabile che conta le volte che lo strumento non può dare un output aggiornato perchè il valore ponderato è fuori media
- // Resetta a 0 il valore di tutte le 10 posizioni del buffer quando deve riiniziare il giro
- if (buffer_pieno_tds) {
- for (int i = 0; i < 10; i++) {
- buffer_letture_V_tds[i] = 0.0; // Reset di tutte le posizioni a 0
- }
- buffer_pieno_tds = false;
- indice_buffer_tds = 0;
- }
- // Inserisce la nuova lettura grezza nel buffer
- buffer_letture_V_tds[indice_buffer_tds] = id(valore_tds_grezzo).state;
- // Incrementa l'indice per la prossima lettura
- indice_buffer_tds++;
- if (indice_buffer_tds >= 10) {
- buffer_pieno_tds = true;
- ESP_LOGI("sensore_TDS", "STATO ATTUALE DEL BUFFER:");
- for (int i = 0; i < 10; i++) {
- ESP_LOGI("sensore_TDS", "Posizione %d: %.3f V", i, buffer_letture_V_tds[i]);
- }
- ///////////////////////////////////////////////////////////////
- // CONTROLLO RISPETTO TOLLERANZA DI SOGLIA FRA LE 10 LETTURE //
- ///////////////////////////////////////////////////////////////
- // Calcolo della media provvisoria
- float somma_valori_V_grezze_tds = 0;
- for (int i = 0; i < 10; i++) {
- somma_valori_V_grezze_tds += buffer_letture_V_tds[i];
- }
- float media_provvisoria_V_grezze_tds = somma_valori_V_grezze_tds / 10;
- // Calcolo valore assoluto del fuori soglia per la lettura del pH grezzo
- float soglia_di_scarto_V_grezze_tds = media_provvisoria_V_grezze_tds * id(soglia_errore_massimo_ammesso_singola_lettura_grezza_tds);
- ESP_LOGI("sensore_TDS","CONTROLLO DEL RISPETTO DELLA TOLLERANZA DI SOGLIA FRA LE 10 LETTURE");
- ESP_LOGI("sensore_TDS", "Essendo la soglia di scarto calcolata di ±%.3f V e la media delle 10 misurazioni di %.3f V,", soglia_di_scarto_V_grezze_tds, media_provvisoria_V_grezze_tds);
- ESP_LOGI("sensore_TDS", "rimangono solamente questi valori validi:");
- // Calcolo finale della media ponderata escludendo valori fuori soglia
- somma_valori_V_grezze_tds = 0;
- int conteggio_valori_V_in_soglia_tds = 0;
- ESP_LOGI("sensore_TDS","Valori utilizzabili rimasti:");
- for (int i = 0; i < 10; i++) {
- if (fabs(buffer_letture_V_tds[i] - media_provvisoria_V_grezze_tds) <= soglia_di_scarto_V_grezze_tds) { //fabs= valore assoluto
- ESP_LOGI("sensore_TDS", "Posizione n° %d: Valore: %.3f V", i, buffer_letture_V_tds[i]);
- somma_valori_V_grezze_tds += buffer_letture_V_tds[i];
- conteggio_valori_V_in_soglia_tds++;
- }
- }
- if (conteggio_valori_V_in_soglia_tds == 0) {
- ESP_LOGI("sensore_TDS", " NESSUNO!!");
- }
- // a questo punto somma_valori_V_grezze_tds conterrà la somma dei SOLI valori in soglia in numero quantificati dalla variabile conteggio_valori_V_in_soglia_ph
- if (fabs(ultimo_valore_V_grezza_processato_tds) > 0.0001) { // Non primo giro N.B. utilizzato fabs e il numero float a causa delle piccole grandezze in gioco
- if (conteggio_valori_V_in_soglia_tds > 0) { // Se c'è almeno un valore valido, calcola la media
- conteggio_cicli_con_valore_tds_tutti_fuori_media = 0; // Resetta il contatore dei cicli fuori media perchè devono essere CONSECUTIVI
- // Calcola il nuovo valore processato
- nuovo_valore_V_grezza_processato_tds = somma_valori_V_grezze_tds / conteggio_valori_V_in_soglia_tds;
- ESP_LOGI("sensore_TDS", "Ultimo valore grezzo processato: %.3f V ==> Nuovo valore grezzo processato: %.3f V",ultimo_valore_V_grezza_processato_tds , nuovo_valore_V_grezza_processato_tds);
- } else {
- ESP_LOGI("sensore_TDS", "Numero di volte che TUTTE le letture vengono calcolate fuori soglia: %d", (conteggio_cicli_con_valore_tds_tutti_fuori_media + 1));
- conteggio_cicli_con_valore_tds_tutti_fuori_media++; // Incrementa il contatore di cicli fuori media
- if (conteggio_cicli_con_valore_tds_tutti_fuori_media == 5) {
- ESP_LOGI("sensore_TDS", "Superati i 5 cicli con tutte le letture fuori media!");
- id(invia_notifica_superati_5_cicli_consecutivi_di_letture_fuori_media_tds).execute(); //Manda la notifica sul cellulare
- conteggio_cicli_con_valore_tds_tutti_fuori_media = 0; // Reset della variabile
- nuovo_valore_V_grezza_processato_tds = media_provvisoria_V_grezze_tds; // Prende per buono il valore grezzo medio
- ESP_LOGI("sensore_TDS", "Utilizzato come valore di fallback il valore grezzo medio: %.3f V", nuovo_valore_V_grezza_processato_tds);
- } else {
- nuovo_valore_V_grezza_processato_tds = ultimo_valore_V_grezza_processato_tds; // Ripropone la misurazione grezza precedente
- ESP_LOGI("sensore_TDS", "Utilizzato come valore di fallback la misurazione grezza precedente: %.3f V", nuovo_valore_V_grezza_processato_tds);
- }
- }
- } else {
- ESP_LOGI("sensore_TDS", "Questo è il primo giro della giostra!!");
- ESP_LOGI("sensore_TDS", "Utilizzato il valore della media provvisoria grezza: %.3f V", media_provvisoria_V_grezze_tds);
- nuovo_valore_V_grezza_processato_tds = media_provvisoria_V_grezze_tds; // Prende il valore grezzo medio, non avendo, allo stato, altri dati a disposizione
- }
- ///////////////////////////////////////////////////////////////////////
- // CONTROLLO RISPETTO TOLLERANZA DI SOGLIA CON LA LETTURA PRECEDENTE //
- ///////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- // DA NON FARE NEL PERIODO TRA IL RABBOCCO E LA PRIMA IRRIGAZIONE //
- ///////////////////////////////////////////////////////////////////////
- auto now = id(homeassistant_time).now(); // Ottieni l'orario corrente
- if (now.hour >= 3 && now.hour < 6) {
- ESP_LOGI("pHmetro", "FASCIA ORARIA INERDETTA AL CONTROLLO DEL RISPETTO DELLA SOGLIA CON LA LETTURA PRECEDENTE.");
- } else {
- ESP_LOGI("sensore_TDS","CONTROLLO DEL RISPETTO DELLA TOLLERANZA DI SOGLIA FINALE");
- ESP_LOGI("sensore_TDS", "Ultimo valore grezzo processato: %.3f V ==> Nuovo valore grezzo processato: %.3f V",ultimo_valore_V_grezza_processato_tds , nuovo_valore_V_grezza_processato_tds);
- if (fabs(ultimo_valore_V_grezza_processato_tds) > 0.0001) { // Non primo giro N.B. utilizzato fabs e il numero float a causa delle piccole grandezze in gioco
- ESP_LOGI("sensore_TDS", "Valore di scarto %.3f V Soglia impostata: %.3f V", fabs(nuovo_valore_V_grezza_processato_tds - ultimo_valore_V_grezza_processato_tds) / ultimo_valore_V_grezza_processato_tds, id(soglia_differenza_nuova_lettura_grezza_ammessa_tds));
- if ((fabs(nuovo_valore_V_grezza_processato_tds - ultimo_valore_V_grezza_processato_tds) / ultimo_valore_V_grezza_processato_tds) > id(soglia_differenza_nuova_lettura_grezza_ammessa_tds)) { //Soglia NON rispettata)
- ESP_LOGI("sensore_TDS", "Il nuovo valore misurato è fuori dalla soglia impostata rispetto al valore precedente!!");
- ESP_LOGI("sensore_TDS", "Numero di volte che il valore viene calcolato fuori soglia: %d", conteggio_cicli_con_valore_tds_fuori_media + 1);
- conteggio_cicli_con_valore_tds_fuori_media++; // incrementa valore letture fuori media
- if (conteggio_cicli_con_valore_tds_fuori_media == 5) {
- ESP_LOGI("sensore_TDS", "Superati i 5 cicli con la lettura fuori media!");
- conteggio_cicli_con_valore_tds_fuori_media = 0; // resetta la variabile
- id(invia_notifica_superati_5_cicli_consecutivi_di_letture_fuori_media_tds).execute(); //Manda la notifica sul cellulare
- // fa passare il valore attuale di nuovo_valore_V_grezza_processato_tds
- } else {
- nuovo_valore_V_grezza_processato_tds = ultimo_valore_V_grezza_processato_tds;
- ESP_LOGI("sensore_TDS", "Utilizzato come valore di fallback la misurazione grezza precedente: %.3f V", nuovo_valore_V_grezza_processato_tds);
- // Fa passare il valore precedente)
- }
- } else {
- ESP_LOGI("sensore_TDS", "Il nuovo valore misurato %.3f V rientra nella soglia impostata rispetto al valore precedente.", nuovo_valore_V_grezza_processato_tds);
- conteggio_cicli_con_valore_tds_fuori_media = 0; // resetta la variabile perchè i cicli devono essere CONSECUTIVI
- }
- } else {
- ESP_LOGI("sensore_TDS", "Questo è il primo giro della giostra!!");
- ESP_LOGI("sensore_TDS", "Utilizzato la misurazione grezza attuale: %.3f V", nuovo_valore_V_grezza_processato_tds);
- }
- }
- ESP_LOGI("sensore_TDS", "Ultimo valore grezzo processato: %.3f V ==> Nuovo valore grezzo processato: %.3f V",ultimo_valore_V_grezza_processato_tds, nuovo_valore_V_grezza_processato_tds);
- ultimo_valore_V_grezza_processato_tds = nuovo_valore_V_grezza_processato_tds;
- //////////////////////////////////////////////////////////////////////////////////////
- // TRASFORMAZIONE DEI VOLT IN TDS //
- // NEL NOSTRO CONTESTO DI FUNZIONAMENTO DELLO STRUMENTO ABBIAMO: //
- // RANGE TDS: 0~1000ppm E UN SEGNALE DI USCITA: 0~2,3V //
- // QUINDI TDS= (TENSIONE (V) /2,3 (V)) * 1000ppm ==> TENSIONE(V) * (1000ppm/2,3(V)) //
- // TDS= TENSIONE (V) * 435 //
- //////////////////////////////////////////////////////////////////////////////////////
- id(nuovo_valore_tds_grezzo_processato) = nuovo_valore_V_grezza_processato_tds * 435.0 ;
- ESP_LOGI("sensore_TDS", "Valore TDS calcolato dalla tensione: %.1fppm", id(nuovo_valore_tds_grezzo_processato));
- /////////////////////////////////////////////////////////////////////////////////////////////////////
- // PONDERAZIONE DEL VALORE DEL TDS IN RELAZIONE ALLA TEMPERATURA DEL FLUIDO //
- // LA TEMPERATURA INFLUISCE SULLA CONDUTTIVITA' ELETTRICA E QUINDI SUL TDS //
- // LA FORMULA CORRENTEMENTE UTILIZZATA E': //
- // TDScompensato= TDSmisurato * (1 + (fattore di compensazione *(Tattuale-Triferimento)) //
- // DOVE: Triferimento= 25° e fattore di compensazione = 0,019 (VALORE DI USO COMUNE IN IDROPONICA) //
- /////////////////////////////////////////////////////////////////////////////////////////////////////
- if (id(lastricosolare_valoretemperaturaponderatasoluzionefertilizzantepostazioneidroponica8).has_state()) { // solo se ha un valore valido
- id(nuovo_valore_tds_grezzo_processato) *= (1+(0.019*(id(lastricosolare_valoretemperaturaponderatasoluzionefertilizzantepostazioneidroponica8).state -25)));
- ESP_LOGI("sensore_TDS", "Valore TDS ponderato con la temperatura: %.1fppm Temperatura rilevata: %.1f°C", id(nuovo_valore_tds_grezzo_processato), id(lastricosolare_valoretemperaturaponderatasoluzionefertilizzantepostazioneidroponica8).state);
- } else {
- ESP_LOGI("sensore_TDS", "ATTENZIONE !! Valore TDS NON ponderato con la temperatura il cui valore non è allo stato disponibile.");
- }
- // AGGIUNGE IL VALORE DI COMPENSAZIONE PROVENIENTE DA HOME ASSISTANT
- if (id(ha_compensazionetdssoluzionefertilizzantepostazioneidroponica8).has_state()) { // solo se ha un valore valido
- id(nuovo_valore_tds_grezzo_processato) += id(ha_compensazionetdssoluzionefertilizzantepostazioneidroponica8).state;
- ESP_LOGI("sensore_TDS", "Valore TDS ponderato con la compensazione da Home Assistant: %.1f ppm Valore correttivo: %.1fppm", id(nuovo_valore_tds_grezzo_processato), id(ha_compensazionetdssoluzionefertilizzantepostazioneidroponica8).state);
- }
- // Verifica che il TDS sia valido
- if (isnan(id(nuovo_valore_tds_grezzo_processato)) || id(nuovo_valore_tds_grezzo_processato) < 0.0 || id(nuovo_valore_tds_grezzo_processato) > 1000) {
- ESP_LOGI("sensore_TDS", "Valore TDS non valido: %.1f", id(nuovo_valore_tds_grezzo_processato));
- id(lastricosolare_valoretdsponderatosoluzionefertilizzantepostazioneidroponica8).publish_state(id(lastricosolare_valoretdsponderatosoluzionefertilizzantepostazioneidroponica8).state); // Ripubblica il valore precendete
- } else {
- ESP_LOGI("sensore_TDS", "Valore TDS finale: %.2f", id(nuovo_valore_tds_grezzo_processato));
- id(lastricosolare_valoretdsponderatosoluzionefertilizzantepostazioneidroponica8).publish_state(id(nuovo_valore_tds_grezzo_processato)); // Pubblica il valore corretto
- }
- }
- - platform: hx711
- id: lastricosolare_volumedellasoluzionefertilizzantepostazioneidroponica8
- name: "Litri di soluzione fertilizzante nella postazione idroponica numero 8"
- dout_pin: GPIO21
- clk_pin: GPIO22
- gain: 64
- accuracy_decimals: 0
- update_interval: 10s
- filters:
- - calibrate_linear:
- method: exact
- datapoints:
- - offset:
- - lambda: |-
- ESP_LOGI("Cella di carico", "Valore peso grezzo letto: %dKg ", (int)x);
- static int ultimo_valore_peso_valido = 0; // Ultimo valore letto
- if ((int)(abs((int)x - (int)id(offset_tara_cella_di_carico) - (int)ultimo_valore_peso_valido) >= (int)id(sensibilita_cella_di_carico)) && !isnan(x)) { // Controlla se la variazione rispetto all'ultimo valore supera la sensibilità dello strumento
- if (((int)x - (int)id(offset_tara_cella_di_carico)) < 0 || ((int)x - (int)id(offset_tara_cella_di_carico)) > (int)(id(capacita_massima_vasca))) { // Se il valore è negativo o maggiore della capacità impostata, lo ignora
- ESP_LOGI("Cella di carico", "Valore peso ponderato forzato al precedente: %dKg perchè il valore netto risultante è fuori range!!", ultimo_valore_peso_valido);
- } else {
- ultimo_valore_peso_valido = (int)x - (int)id(offset_tara_cella_di_carico); // Aggiorna il valore
- ESP_LOGI("Cella di carico", "Valore peso ponderato: %dKg con tara di: %dKg ACCETTATO!!", ultimo_valore_peso_valido, (int)id(offset_tara_cella_di_carico));
- }
- } else {
- ESP_LOGI("Cella di carico", "Valore peso ponderato: %dKg con tara di: %dKg SCARTATO!!", ultimo_valore_peso_valido, (int)id(offset_tara_cella_di_carico));
- }
- return (int)ultimo_valore_peso_valido;
- # return (((int)ultimo_valore_peso_valido * 2)/1.02); // doppia cisterna più compensazione peso specifico per ottenere i litri
- #####################################################################################
- # SENSORI NECESSARI PER ESPORTARE I VALORI DEI SENSORI DA ESPHOME IN HOME ASSISTANT #
- #####################################################################################
- - platform: template
- id: lastricosolare_valoretemperaturaponderatasoluzionefertilizzantepostazioneidroponica8
- name: "Valore ponderato della temperatura della soluzione fertilizzante nella postazione idroponica numero 8"
- internal: false # questo sensore verrà esportato in home assistant
- #unit_of_measurement: "°C"
- icon: "mdi:thermometer-water"
- #device_class: "temperature"
- #state_class: "measurement"
- accuracy_decimals: 1
- lambda: |-
- if (id(ha_compensazionetemperaturasoluzionefertilizzantepostazioneidroponica8).has_state()) { // solo se ha un valore valido
- return id(lastricosolare_temperaturagrezzasoluzionefertilizzantepostazioneidroponica8).state + id(ha_compensazionetemperaturasoluzionefertilizzantepostazioneidroponica8).state;
- } else {
- return id(lastricosolare_temperaturagrezzasoluzionefertilizzantepostazioneidroponica8).state;
- }
- - platform: template
- id: lastricosolare_valorephponderatosoluzionefertilizzantepostazioneidroponica8
- name: "Valore ponderato del pH della soluzione fertilizzante nella postazione idroponica numero 8"
- internal: false # questo sensore verrà esportato in home assistant
- icon: "mdi:ph"
- device_class: "ph"
- state_class: "measurement"
- accuracy_decimals: 1
- lambda: |-
- // Restituisce semplicemente il valore che è stato passato dal sensore fisico
- return (int(id(lastricosolare_valorephponderatosoluzionefertilizzantepostazioneidroponica8).state));
- - platform: template
- id: lastricosolare_valoretdsponderatosoluzionefertilizzantepostazioneidroponica8
- name: "Valore ponderato del TDS della soluzione fertilizzante nella postazione idroponica numero 8"
- internal: false # questo sensore verrà esportato in home assistant
- #unit_of_measurement: "ppm"
- state_class: "measurement"
- accuracy_decimals: 0
- lambda: |-
- // Restituisce semplicemente il valore che è stato passato dal sensore fisico
- return (int(id(lastricosolare_valoretdsponderatosoluzionefertilizzantepostazioneidroponica8).state));
- - platform: template
- id: lastricosolare_conducibilitasoluzionefertilizzantepostazioneidroponica8
- name: "Conducibilità della soluzione fertilizzante nella postazione idroponica numero 8"
- internal: false # questo sensore verrà esportato in home assistant
- #unit_of_measurement: "µS/cm"
- state_class: "measurement"
- accuracy_decimals: 0
- lambda: |-
- return (int(id(lastricosolare_valoretdsponderatosoluzionefertilizzantepostazioneidroponica8).state / id(fattore_conversione_tds_conducibilita)));
- binary_sensor:
- ###########################################################################################
- # BINARY_SENSOR NECESSARI PER IMPORTARE I VALORI DEI SENSORI DA HOME ASSISTANT IN ESPHOME #
- ###########################################################################################
- ####################################
- # BINARY_SENSOR PROPRI DELL'ESP-32 #
- ####################################
- - platform: template
- name: "L'ESP32 della postazione idroponica 8 è connesso al WiFi"
- id: esp32_postazione_idroponica_8_connesso_wifi
- lambda: 'return id(sono_connesso_al_wifi);'
- icon: 'mdi:wifi'
- ###########################################################################################
- # BINARY_SENSOR NECESSARI PER ESPORTARE I VALORI DEI SENSORI DA ESPHOME IN HOME ASSISTANT #
- ###########################################################################################
- text_sensor:
- #########################################################################################
- # TEXT_SENSOR NECESSARI PER IMPORTARE I VALORI DEI SENSORI DA HOME ASSISTANT IN ESPHOME #
- #########################################################################################
- ##################################
- # TEXT_SENSOR PROPRI DELL'ESP-32 #
- ##################################
- - platform: wifi_info
- ssid:
- name: "WiFi SSID postazione idroponica 8"
- #########################################################################################
- # TEXT_SENSOR NECESSARI PER ESPORTARE I VALORI DEI SENSORI DA ESPHOME IN HOME ASSISTANT #
- #########################################################################################
- script:
- - id: invia_notifica_superati_5_cicli_consecutivi_di_letture_fuori_media_ph
- then:
- - homeassistant.service:
- service: notify.mobile_app_cellulare_claudio
- data:
- title: "PROBLEMA CON IL SENSORE DEL pH"
- message: "Il pHmetro ha superato i 5 cicli consecutivi con letture sempre fuori soglia!"
- - id: invia_notifica_superati_5_cicli_consecutivi_di_letture_fuori_media_tds
- then:
- - homeassistant.service:
- service: notify.mobile_app_cellulare_claudio
- data:
- title: "PROBLEMA CON IL SENSORE DELLA CONDUCIBILITA'"
- message: "Il conducimetro ha superato i 5 cicli consecutivi con letture sempre fuori soglia!"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement