@Charles Top, merci !
Latest posts made by mikebzh44
-
RE: Compilation ESP Home pour avoir la TIC sur cet ESP
@ch_2i Si tu peux le faire, je veux bien, merci.
-
RE: Compilation ESP Home pour avoir la TIC sur cet ESP
@Charles Du coup, je garde la carte et je trouverai bien une utilité pour le PiTInfo que j'ai commandé
-
RE: Compilation ESP Home pour avoir la TIC sur cet ESP
Je confirme, ça marche nickel !!
Mon YAML au complet :
substitutions: devicename: esp-tic-feyree friendly_name: esp-tic-feyree device_description: Infos TIC chargeur VE esphome: name: $devicename friendly_name: $friendly_name comment: ${device_description} min_version: 2024.6.0 name_add_mac_suffix: false project: name: esphome.web version: '1.0' esp32: board: denky_d4 framework: type: arduino # Enable logging logger: baud_rate: 0 level: INFO #esp8266_store_log_strings_in_flash: False # Enable Home Assistant API api: ota: platform: esphome password: "472f4e3996e22b5cc959fefe4f46d54e" wifi: #ssid: !secret wifi_ssid #password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: {} # Web Server: https://esphome.io/components/web_server.html web_server: local: true port: 80 # auth: # username: !secret esphome_web_server_username # password: !secret esphome_web_server_password # Time: https://esphome.io/components/time.html time: - platform: homeassistant timezone: "Europe/Paris" id: homeassistant_time captive_portal: # Status Binary Sensor: https://esphome.io/components/binary_sensor/status.html binary_sensor: - platform: status name: "Sagem EV Status" # Restart Button: https://esphome.io/components/button/restart.html button: - platform: restart name: "Sagem EV Restart" # https://esphome.io/custom/uart.html uart: rx_pin: number: GPIO8 # Pin Rx2 ignore_pin_validation_error: true baud_rate: 1200 parity: EVEN data_bits: 7 #rx_buffer_size: 512 # https://esphome.io/components/sensor/teleinfo.html teleinfo: update_interval: 60s historical_mode: true # https://esphome.io/components/sensor/index.html sensor: # WiFi - platform: wifi_signal name: "WiFi Signal Sensor" update_interval: 60s unit_of_measurement: dB accuracy_decimals: 0 force_update: false icon: mdi:wifi # Uptime - platform: uptime id: uptime_seconds name: "Uptime Sensor" update_interval: 60s unit_of_measurement: s accuracy_decimals: 0 force_update: false icon: mdi:clock-start # Production - platform: teleinfo tag_name: "BASE" name: "Recharge VE" unit_of_measurement: kWh device_class: energy state_class: total_increasing icon: mdi:flash accuracy_decimals: 2 filters: - multiply: 0.001 - filter_out: 0 text_sensor: - platform: template name: Uptime update_interval: 60s icon: mdi:clock-start lambda: |- int seconds = (id(uptime_seconds).state); int days = seconds / (24 * 3600); seconds = seconds % (24 * 3600); int hours = seconds / 3600; seconds = seconds % 3600; int minutes = seconds / 60; seconds = seconds % 60; if ( days ) { return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() }; } else if ( hours ) { return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() }; } else if ( minutes ) { return { (String(minutes) +"m "+ String(seconds) +"s").c_str() }; } else { return { (String(seconds) +"s").c_str() }; }
-
RE: Compilation ESP Home pour avoir la TIC sur cet ESP
@Charles Merci, je vais tester ça ce WE
-
Compilation ESP Home pour avoir la TIC sur cet ESP
Bonjour.
Je viens de recevoir ma carte Denky D4 et je n'arrive pas à compiler un fichier YAML pour Home Assistant
J'ai cette erreur :
INFO ESPHome 2024.6.6 INFO Reading configuration /config/esphome/esphome-web-f5bfa8.yaml... Failed config uart: [source /config/esphome/esphome-web-f5bfa8.yaml:77] - id: uart_bus This pin cannot be used on ESP32s and is already used by the flash interface (function: Flash Data 1). rx_pin: GPIO8 baud_rate: 1200 parity: EVEN data_bits: 7
Et voici mon code YAML :
substitutions: name: esp-tic-feyree friendly_name: esp-tic-feyree device_description: Infos TIC Recharge VE esphome: name: ${name} friendly_name: ${friendly_name} comment: ${device_description} min_version: 2024.6.0 name_add_mac_suffix: false project: name: esphome.web version: '1.0' esp32: # board: adafruit_qtpy_esp32 board: denky_d4 framework: type: esp-idf # Enable logging logger: # Enable Home Assistant API api: # Allow Over-The-Air updates ota: - platform: esphome # Allow provisioning Wi-Fi via serial improv_serial: wifi: # Set up a wifi access point ap: {} # In combination with the `ap` this allows the user # to provision wifi credentials to the device via WiFi AP. captive_portal: dashboard_import: package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main import_full_config: true # Sets up Bluetooth LE (Only on ESP32) to allow the user # to provision wifi credentials to the device. esp32_improv: authorizer: none # To have a "next url" for improv serial web_server: local: true port: 80 # auth: # username: !secret esphome_web_server_username # password: !secret esphome_web_server_password # Time: https://esphome.io/components/time.html time: - platform: homeassistant timezone: "Europe/Paris" id: homeassistant_time # Status Binary Sensor: https://esphome.io/components/binary_sensor/status.html binary_sensor: - platform: status name: "Sagem Status" # Restart Button: https://esphome.io/components/button/restart.html button: - platform: restart name: "Sagem Restart" # https://esphome.io/custom/uart.html uart: id: uart_bus rx_pin: GPIO8 # Pin Rx2 baud_rate: 1200 parity: EVEN data_bits: 7 #rx_buffer_size: 512 # https://esphome.io/components/sensor/teleinfo.html teleinfo: update_interval: 60s historical_mode: true # https://esphome.io/components/sensor/index.html sensor: # WiFi - platform: wifi_signal name: "WiFi Signal Sensor" update_interval: 60s unit_of_measurement: dB accuracy_decimals: 0 force_update: false icon: mdi:wifi # Uptime - platform: uptime id: uptime_seconds name: "Uptime Sensor" update_interval: 60s unit_of_measurement: s accuracy_decimals: 0 force_update: false icon: mdi:clock-start # Production - platform: teleinfo tag_name: "BASE" name: "Recharge VE" unit_of_measurement: kWh device_class: energy state_class: total_increasing icon: mdi:flash accuracy_decimals: 2 filters: - multiply: 0.001 - filter_out: 0 text_sensor: - platform: template name: Uptime update_interval: 60s icon: mdi:clock-start lambda: |- int seconds = (id(uptime_seconds).state); int days = seconds / (24 * 3600); seconds = seconds % (24 * 3600); int hours = seconds / 3600; seconds = seconds % 3600; int minutes = seconds / 60; seconds = seconds % 60; if ( days ) { return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() }; } else if ( hours ) { return { (String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() }; } else if ( minutes ) { return { (String(minutes) +"m "+ String(seconds) +"s").c_str() }; } else { return { (String(seconds) +"s").c_str() }; }
Quand j'ai initialisé la carte avec ESPHome, elle était vu comme :
esp32: board: esp32dev framework: type: arduino
Mais même avec cette définition, la compilation donne la même erreur.
-
RE: Lecture Linky via dongle et compteur via GPIO
Oui, je vais revoir ma copie et réintégrer le calcul des checksum.
Je les avais viré car j'avais des erreurs liées à la fonction length.
Mais les trames Standard sont aussi différentes des Historique car les Historiques fournissent toujours un tuple (clé, valeur, check) alors que les Standards peuvent fournir un tuple (clé, timestamp, valeur, check) :
SINSTS 00488 Z
SMAXSN E210424063606 01899 GVoir carrément plus :
PJOURF+1 0000C001 07248002 2324C001 NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE NONUTILE
Autre question, pour utiliser /dev/ttyAMA0, on doit l'initialiser au boot du Pi, contrairement à ton dongle.
Pour l'instant, j'ai mis la commande :
stty -F /dev/ttyAMA0 1200 sane evenp parenb cs7 -crtscts
dans la crontab de root avec @reboot
Je suppose que c'est un peu crade comme manip, non ?
-
RE: Lecture Linky via dongle et compteur via GPIO
En bidouillant un peu la lecture des trames (je vire le calcul des checksums entre autre), j'arrive à décoder les trames et extraire les couples label/values qui m'intéressent :
// Enlever les codes début et fin de trame var lines = msg.payload.toString().replace("\u0002\n","").replace("\r\u0003",""); // Récupérer chaque ligne une à une lines = lines.split("\r\n"); for (var line in lines) { // Recupérer le label, la valeur et la checksum // si la checksum est un espace on le remplace par un caractère non // autorisé en checksum (ici 's') pour eviter pb de split // donc espace espace devient espace s var myline = lines[line].toString().replace(" "," s").split(" "); if (myline.length == 1) { var entries = myline[0].split("\t"); var label = entries[0]; var value = entries[1]; if ( label == "EASF01") { flow.set("HC",parseInt(value,10)); } if ( label == "EASF02") { flow.set("HP",parseInt(value,10)); } if ( label == "LTARF") { if (value == 'HEURE PLEINE') { flow.set("TARIF",'HP..'); } else { flow.set("TARIF",'HC..'); } } if ( label == "IRMS1") { flow.set(label,parseInt(value,10)); } if ( label == "SINSTS") { flow.set(label,parseInt(value,10)); } if ( label == "EAIT") { flow.set(label,parseInt(value,10)); } } }
-
RE: Lecture Linky via dongle et compteur via GPIO
La lecture de /dev/ttyAMA0 marche bien debug :
ADSC 061961603260 5 VTIC 02 J DATE E210424091645 D NGTF H PLEINE/CREUSE \ LTARF HEURE PLEINE A EAST 010893318 0 EASF01 005110053 1 EASF02 005783265 G EASF03 000000000 $ EASF04 000000000 % EASF05 000000000 & EASF06 000000000 ' EASF07 000000000 ( EASF08 000000000 ) EASF09 000000000 * EASF10 000000000 " EASD01 005110053 / EASD02 005783265 E EASD03 000000000 " EASD04 000000000 # EAIT 000038838 # ERQ1 000007904 O ERQ2 000007294 R ERQ3 000040821 L ERQ4 004086122 U IRMS1 002 0 URMS1 234 C PREF 09 H PCOUP 09 " SINSTS 00465 U SMAXSN E210424063606 01899 G SMAXSN-1 E210423060619 02700 S SINSTI 00000 < SMAXIN E210424000000 00000 M SMAXIN-1 E210423134052 00634 F CCASN E210424090000 00460 8 CCASN-1 E210424083000 00836 _ CCAIN E210424090000 00000 $ CCAIN-1 E210424083000 00000 D UMOY1 E210424091000 234 + STGE 001A4501 A MSG1 PAS DE MESSAGE < PRM 14275687320408 : RELAIS 000 B NTARF 02 O NJOURF 00 & NJOURF+1 00 B PJOURF+1 0000C001 ...
Mais quand je branche ma fonction de décodage :
// Enlever les codes début et fin de trame var lines = msg.payload.toString().replace("\u0002\n","").replace("\r\u0003",""); // Récupérer chaque ligne une à une lines = lines.split("\r\n"); for (var line in lines) { var i; var checksum = 32; // Recupérer le label, la valeur et la checksum // si la checksum est un espace on le remplace par un caractère non // autorisé en checksum (ici 's') pour eviter pb de split // donc espace espace devient espace s var myline = lines[line].toString().replace(" "," s").split(" "); // on dépile nos 3 valeurs var check = myline.pop(); var value = myline.pop(); var label = myline.pop(); // On peu repositionner la checksum à espace si c'était le cas if (check == "s") check = " "; // Calcul de la checksum sur ce qu'on a reçu, on balaye tous les caractères for (i = 0; i < label.length; i++) checksum += label.charCodeAt(i); for (i = 0; i < value.length; i++) checksum += value.charCodeAt(i); checksum = ((checksum%256) & 63) + 32; checksum = String.fromCharCode(checksum); // Checksum correcte ? if (checksum == check ) { if ( label == "EASF01") { flow.set("HC",parseInt(value,10)); } if ( label == "EASF02") { flow.set("HP",parseInt(value,10)); } if ( label == "LTARF") { if (value == 'HEURE PLEINE') { flow.set("TARIF",'HP..'); } else { flow.set("TARIF",'HC..'); } } if ( label == "IRMS1") { flow.set(label,parseInt(value,10)); } if ( label == "SINSTS") { flow.set(label,parseInt(value,10)); } if ( label == "EAIT") { flow.set(label,parseInt(value,10)); } } else { console.log("'%s' '%s' '%s' => Bad Checksum '%s'", label, value, check, checksum ); } }
J'ai un message d'erreur dans le debug :
TypeError: Cannot read property 'length' of undefined
Le parsing est différent entre les trames Historiques et Standard ?
Car j'ai pris le code dans ton exemple sur une trame Historique :
Si ça peut aider, voici les trames reçues avec picocom :
-
RE: Lecture Linky via dongle et compteur via GPIO
Ca commence à rentrer, merci pour les tuyaux
Ce WE, je rajoute la lecture du Linky via ttyAMA0 et je fusionne mes 2 tabes (car j'avais une table pour les index du Linky et une table pour l'index du Sagem + ECS).
Restera ensuite à intégrer les sondes de T° DHT11 et DS18B20 mais y a des nodes pour ça donc ça devrait le faire sans problème
Par contre, pour sauvegarder l'index du compteur Sagem dans le contexte, je fais flow.set('WH',value) mais pour lire la variable, je ne peux pas faire comme dans ton exemple (context.flow.WH) mais je dois passer par flow.get('WH')