• # Corrections et compléments

    Posté par (site web personnel, Mastodon) . En réponse au journal Je domotise mes volets roulants (avec cron et mqtt). Évalué à 5.

    Une erreur s'est glissée dans l'exemple de mosquitto_sub: il faut utiliser l'option -v au lieu de -d pour avoir l'affichage du topic. -d fonctionne aussi mais affiche en plus plein d'autres choses pas intéressantes.

    J'ai mis en place une règle cron pour lancer un script toute les minutes via /etc/cron.d/shutters:

    MAILTO=root
    */5 * * * * pulkomandy /usr/local/bin/shutters.py
    

    Le contenu du script:

    #!/usr/bin/python3
    import paho.mqtt.client as mqtt
    from datetime import datetime
    import sys
    now = datetime.now()
    action = None
    OPEN = 99
    WARN = 90
    HALF = 50
    CLOSE = 0
    shutters = [
     "zwave/Salon_Ouest/Shutter_Salon_Ouest/switch_multilevel/endpoint_1/targetValue/set",
     "zwave/Salon_Est/Shutter_Salon_Est/switch_multilevel/endpoint_1/targetValue/set",
     "zwave/Cuisine/Shutter_Cuisine/switch_multilevel/endpoint_1/targetValue/set",
    ]
    if now.month < 4 or month > 9:
     # Winter mode: close at night
     if now.hour == 7 and now.minute > 40 and now.minute <= 45:
     action = OPEN
     # Close a little bit first, make sure everyone is inside
     if now.hour == 20 and now.minute > 55 and now.minute <= 60:
     action = WARN
     if now.hour == 21 and now.minute > 0 and now.minute <= 5:
     action = CLOSE
    else:
     # Summer mode: close during the day
     # On weekends, only half-close to let some light in
     if now.weekday() > 4:
     if now.hour == 8 and now.minute > 25 and now.minute <= 30:
     action = WARN
     if now.hour == 8 and now.minute > 30 and now.minute <= 35:
     action = HALF
     if now.hour == 23 and now.minute > 0 and now.minute <= 5:
     action = OPEN
     else:
     if now.hour == 8 and now.minute > 25 and now.minute <= 30:
     action = WARN
     if now.hour == 8 and now.minute > 30 and now.minute <= 35:
     action = CLOSE
     if now.hour == 17 and now.minute > 25 and now.minute <= 30:
     action = WARN
     if now.hour == 17 and now.minute > 30 and now.minute <= 35:
     action = HALF
     if now.hour == 23 and now.minute > 0 and now.minute <= 5:
     action = OPEN
    # If there is nothing to do, well, do nothing
    if action is None:
     sys.exit(0)
    client = mqtt.Client()
    # Number of pending requests
    pending = -1
    # Callback called when the client is connected.
    # Publish all commands and set "pending" to continue looping until they are processed.
    @client.connect_callback()
    def on_connect(client, userdata, flags, reason_code):
     global pending
     pending = len(shutters)
     for shutter in shutters:
     client.publish(shutter, action)
    # Publish esponse callback. Decrement the pending request count
    @client.publish_callback()
    def on_publish(client, userdata, mid):
     global pending
     pending = pending - 1
    # Connect and wait for all requests to be processed
    client.connect("localhost")
    while pending != 0:
     client.loop()

    Je verrai si cela nécessite des améliorations plus tard. On peut beaucoup simplifier en faisant un script qui accepte en argument le pourcentage d'ouverture des volets, et plusieurs règles cron pour l'appeler aux heures adéquates. Pour commencer j'ai fait sans trop réfléchir, un script appelé toutes les 5 minutes, qui décide pour chaque tranche de 5 minutes ce qu'il a besoin de faire ou pas.

    Déjà je vous dirai demain si mes volets se sont bien ouverts tout seuls!