Intégration sonde cht8305 i2c Rpi5 + Problème script commutateur reviens a zero après reboot

Bonjour,

je suis nouveau sur HA j’ai décider de migrer de domoticz a Ha mais j’ai pas mal de soucis
j’ai réussi a interagir avec le gpio pour ma carte 8 relais par contre pour les scripts… mais c’est pas le sujet.

J’ai plusieurs carte sur I2c du rasp
une carte multiplexer Gravity pour 3 sondes cht8305 en i2c (car même adresse de sonde)
j’utilisai les library Blinka et
adafruit-circuitpython-tca9548a sauf que après avoir bien galère pour entrer des commande pip je fini par avoir des erreurs. j’essai d’installer un compilateur C car souci gcc et enfaite ça marche pas car les library utilise des dossiers diffèrent qui existe sur debian mais pas sur alpine

j’ai aussi une carte ads11x5 pour sonde analogique d’humidité dans le sol mais bon c’est la même histoire

je met le code du script python pour les 3 sondes cht8305

import subprocess
import board
import adafruit_tca9548a
import busio
import time
import requests
from requests.auth import HTTPBasicAuth

# I2C Address for the TCA9548A
TCA9548A_ADDRESS = 0x70

# I2C Address for the CHT8305
CHT8305_ADDRESS = 0x40
I2C_DELAY_TIME = 0.05

REG_TEMPERATURE = 0x00
REG_HUMIDITY = 0x01

# IDX des capteurs dans Domoticz
idx_temperature_humidityP = 78
idx_temperature_humidityPM = 82
idx_temperature_humidityEXT = 83

# Adresse IP et port de votre Domoticz
domoticz_ip = "x"
domoticz_port = 8080

# Login et mot de passe de votre Domoticz
user = "x"
password = "x"

i2c = busio.I2C(board.SCL, board.SDA)

# Create the TCA9548A object and give it the I2C bus
tca = adafruit_tca9548a.TCA9548A(i2c, address=TCA9548A_ADDRESS)

def read_CHT8305(channel):
    temperature = None
    humidity = None

    if tca[channel].try_lock():
        i2cget = subprocess.Popen(['i2cget', '-y', '1', '0x40','0' ], stdout=subprocess.PIPE)
        print("Reading from channel", channel)
        i2c.writeto(CHT8305_ADDRESS, bytes([REG_TEMPERATURE]), end=False)
        time.sleep(I2C_DELAY_TIME)
        data = bytearray(4)
        data[0] = REG_TEMPERATURE
        i2c.readfrom_into(CHT8305_ADDRESS, data)

        temperature = (data[0] << 8 | data[1]) * 165 / 65535 - 40
        humidity = (data[2] << 8 | data[3]) / 65535 * 100

        print("Temperature: ", temperature)
        print("Humidity: ", humidity)

        tca[channel].unlock()

    return temperature, humidity

def update_domoticz(idx, temperature, humidity):
    url = '/json.htm?type=command&param=udevice&idx=' + str(idx)
    url += '&nvalue=0&svalue={0:0.1f};{1:0.1f};2'.format(temperature, humidity)
    requete = 'http://' + domoticz_ip + ':' + str(domoticz_port) + url
    r = requests.get(requete, auth=HTTPBasicAuth(user, password))
    if r.status_code != 200:
        print("Erreur API Domoticz")

if __name__ == "__main__":
    for channel, idx in zip(range(3), [idx_temperature_humidityP, idx_temperature_humidityPM, idx_temperature_humidityEXT]):
        temperature, humidity = read_CHT8305(channel)
        if temperature is not None and humidity is not None:
            update_domoticz(idx, temperature, humidity)
        else:
            print('Problème avec la lecture du capteur. Essayez à nouveau!')


Au dela de ça je me suis dit. je vais me faire un script pour les lampes
en gros j’ai une heure d allumage et ça doit tourner en 12 ou 18h pour cela j’y arrive. le truc c 'est que si je reboot ou je sais pas coupure de courant pour maintenance ou autre. les commutateur sont a zero. sans parler des perte de communications qui decide de changer l’etat du commutateur. alors c’est bien mais pas pour mon utilisation.

voici le code .lua pour une lampe

commandArray = {}
--cro--
if (os.date('%H:%M') >= executionTimeon or os.date('%H:%M') > executionTimeon) and otherdevices['Lampe P (1)'] == 'Off' and otherdevices['ON=12H / OFF=18H'] == 'Off' then
        commandArray['Lampe P (1)']='On'
    else
if os.date('%H:%M') == executionTimeoff and otherdevices['Lampe P (1)'] == 'On' and otherdevices['ON=12H / OFF=18H'] == 'Off' then
                  commandArray['Lampe P (1)']='Off'
        end
        end
--flo
if (os.date('%H:%M') >= executionTimeon or os.date('%H:%M') < executionTimeflo) and otherdevices['Lampe P (1)'] == 'Off' and otherdevices['ON=12H / OFF=18H'] == 'On' then
        commandArray['Lampe P (1)']='On'
        else
if os.date('%H:%M') == executionTimeflo and otherdevices['Lampe P (1)'] == 'On' and otherdevices['ON=12H / OFF=18H'] == 'On' then
        commandArray['Lampe P (1)']='Off'
        end
    end

return commandArray

je comprends pas, domoticz c 'est moche mais si tu coupes le réseau, il continue a faire le taff et pareil après un coupure de courant.

quand je galère a faire un script simple pour allumer a une heure fixe et éteindre a deux heure différente faut 3 automations et j’ai pas de fonction « chien de garde » pour que la lampe ce rallume si nous sommes entre l’heure d allumage et d’extinction.

j’ose même pas imaginé le nombre d’automation pour la gestion du VPD (Vapour Pressure Deficit)

extrait du code .lua :rofl:

-- Définition des seuils de VPD
local VPDmax = 1.48
local VPDmin = 1.2
local VPDtarget = 1.4
local VPDon = 1.3 -- Seuil pour l'assecheur
local VPDoff = 1.35 -- Seuil pour le chauffage 

-- Variables PID
local Kp = 1.0 -- Coefficient proportionnel
local Ki = 0.05 -- Coefficient intégral
local Kd = 0.1 -- Coefficient dérivé
local integral = 0 -- Partie intégrale
local lastError = 0 -- Dernière erreur pour la partie dérivée

-- Gestion de la sonde P
if (devicechanged[sondeP]) then
    local temperatureP = devicechanged[string.format('%s_Temperature', sondeP)] -- Température relevée dans P
    local humidityP = devicechanged[string.format('%s_Humidity', sondeP)] -- Humidité relevée dans P

    -- Calcul du VPD
    local vpd = (1.0 - (humidityP / 100.0)) * (0.611 * math.exp((17.27 * temperatureP) / (temperatureP + 237.3)))

    print(string.format('Lecture de la sondeP %s: Température = %.2f, Humidité = %.2f, VPD = %.2f', sondeP, temperatureP, humidityP, vpd))

    -- Calcul PID pour VPDtarget
    local error = VPDtarget - vpd
    integral = integral + error
    local derivative = error - lastError
    local output = Kp * error + Ki * integral + Kd * derivative
    lastError = error

    -- Limiter la sortie PID pour correspondre à la plage de température
    output = math.max(0, math.min(output, 100))

    -- Gestion de l'extraction
    if (vpd < VPDtarget and otherdevices[intraP] == 'On') then
        print('Extinction intraP car VPD < ' .. VPDtarget)
        commandArray[intraP] = 'Off'
    elseif (vpd > VPDtarget and otherdevices[intraP] == 'Off') then
        print('Allumage intraP car VPD > ' .. VPDtarget)
        commandArray[intraP] = 'On'
    end

    -- Gestion du brassage
    -- Activer le brassage si le VPD est trop élevé
    if (vpd > VPDtarget and otherdevices[brassage] == 'Off') then
        print('Allumage du brassage car VPD > ' .. VPDtarget)
        commandArray[brassage] = 'On'
    -- Désactiver le brassage si le VPD est trop bas
    elseif (vpd < VPDtarget and otherdevices[brassage] == 'On') then
        print('Extinction du brassage car VPD < ' .. VPDtarget)
        commandArray[brassage] = 'Off'
    end

    -- Gestion de l'assecheur
    -- Activer l'assecheur si le VPD est trop élevé
    if (vpd < VPDmin and otherdevices[assecheur] == 'Off') then
        print('Allumage de l\'assecheur car VPD < ' .. VPDmin)
        commandArray[assecheur] = 'On'
    -- Désactiver l'assecheur si le VPD est acceptable
    elseif (vpd > VPDon and otherdevices[assecheur] == 'On') then
        print('Extinction de l\'assecheur car VPD > ' .. VPDon)
        commandArray[assecheur] = 'Off'
    end
    
    -- Gestion du radiateurP
    -- Activer radiateurP si le VPD est trop élevé
    if (vpd < VPDon and otherdevices[radiateurP] == 'Off') then
        print('Allumage de du radiateurP car VPD < ' .. VPDon)
        commandArray[radiateurP] = 'On'
    -- Désactiver l'radiateurP si le VPD est acceptable
    elseif (vpd > VPDoff and otherdevices[radiateurP] == 'On') then
        print('Extinction du radiateurP car VPD > ' .. VPDoff)
        commandArray[radiateurP] = 'Off'
    end
end

je cache pas que ça comme a sérieusement me tendre. le passage rpi4 => rpi5 ma deja bien éprouver pour reprendre la main sur les GPIO que ce soit sur HA ( plus simple) que sur domoticz.

A la base j’ai la sortie i2c qui ne marche plus sur le rpi4 je me suis dit pour le même prix j’ai le 5 ensuite vu que rien ne marchait niveau gpio je me suis dit autant passer sur HA car j’ai toujours repousser le projet.

Sinon je sais que je peux mettre un esp et que ce serai plus simple mais je voulais pas racheter encore un truc alors que tous marche très bien sans sur domoticz.

je suis pas a 20€ mais j’ai deja pas mal de matos a acheter en attente comme des sondes atlas scientific + interface (500€) un dac 0-10v pour la gestion de la lumière et j’en passe

J’ai aussi pensé a aller sur mycodo

Edit: étant sur une config de secours j’ai domoticz sur le rpi4 avec le i2c HS et une rpi2 pour le i2c envoyé direct a domoticz
j’ai donc modifier le script pour envoyé aussi les donné a HA sur le rpi5 en mode prototype.
et bien ça marche :grinning:

donc mes conclusions c’est soit d avoir 2 rasp dont 1 avec Ha et l’autre avec debian
ou préparé ma SD comme domoticz et intaller HA dessus en ligne de commande au lieu de préparer la SD pour home assistant directement

le truc c’est que je vois ça

  • Home Assistant Operating System # ce que j’ai actuellement
  • Home Assistant Container # pas d’addon
  • Home Assistant Core # pas d’addon
  • Home Assistant Supervised # pas trouver de tuto :rofl:

je vais voir comment installer Supervised pour avoir le beurre et l’argent du beurre

Ma configuration


System Information

version core-2025.4.3
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.13.2
os_name Linux
os_version 6.6.74-haos-raspi
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 15.2
update_channel stable
supervisor_version supervisor-2025.04.0
agent_version 1.7.2
docker_version 28.0.4
disk_total 28.0 GB
disk_used 4.2 GB
healthy true
supported true
host_connectivity true
supervisor_connectivity true
ntp_synchronized true
virtualization
board rpi5-64
supervisor_api ok
version_api ok
installed_addons Mosquitto broker (6.5.0), HassOS I2C Configurator (0.14), File editor (5.8.0), Terminal & SSH (9.16.0)
Dashboards
dashboards 3
resources 0
views 3
mode storage
Network Configuration
adapters lo (disabled), end0 (enabled, default, auto), hassio (disabled), docker0 (disabled), veth9a27afe (disabled), veth54bcb88 (disabled), veth3048762 (disabled), veth744fb36 (disabled), veth6d047a9 (disabled), vethc5b83ff (disabled), veth0b37b9c (disabled), vethbc11f9f (disabled), vetha2d7af7 (disabled)
ipv4_addresses lo (127.0.0.1/8), end0 (192.168.1.127/24), hassio (172.30.32.1/23), docker0 (172.30.232.1/23), veth9a27afe (), veth54bcb88 (), veth3048762 (), veth744fb36 (), veth6d047a9 (), vethc5b83ff (), veth0b37b9c (), vethbc11f9f (), vetha2d7af7 ()
ipv6_addresses lo (::1/128), end0 (2a01:e0a:2bb:fb50:ff3b:5891:1c89:897/64, fe80::b76:ad18:dbd:3aa5/64), hassio (fe80::ec74:dfff:fe4a:3004/64), docker0 (fe80::3cb2:3fff:fe02:b/64), veth9a27afe (fe80::bcd3:59ff:fe55:d921/64), veth54bcb88 (fe80::6cdc:51ff:fe3a:6c27/64), veth3048762 (fe80::d011:42ff:fe43:75ed/64), veth744fb36 (fe80::e870:9dff:fe03:88d3/64), veth6d047a9 (fe80::68ab:d8ff:fee8:a70b/64), vethc5b83ff (fe80::c01d:76ff:fe6f:bae7/64), veth0b37b9c (fe80::38be:74ff:feec:6745/64), vethbc11f9f (fe80::1ce7:f5ff:fe6f:c8de/64), vetha2d7af7 (fe80::446b:f6ff:fe0b:578d/64)
announce_addresses 192.168.1.127, 2a01:e0a:2bb:fb50:ff3b:5891:1c89:897, fe80::b76:ad18:dbd:3aa5
Recorder
oldest_recorder_run 16 avril 2025 à 18:32
current_recorder_run 20 avril 2025 à 17:31
estimated_db_size 3.57 MiB
database_engine sqlite
database_version 3.48.0
___