|

Envoyez l’heure de coucher du soleil en MQTT

Voici un script Python3 qui permet d’envoyer une trame MQTT formatée json sur le topic de votre choix, contenant l’heure de coucher du soleil. Ici, en vous abonnant à home/sunset, vous recevrez par exemple :

{« sunset_time »: « 17:41:25 », « latitude »: 47.4108, « longitude »: -2.1692, « timestamp »: « 2026-01-11T16:14:45.542727 »}
Notez qu’il est possible de n’avoir que l’heure en modifiant le code comme suit :

# AVANT (JSON)
payload = {
    "sunset_time": sunset_time,
    "latitude": lat,
    "longitude": lon,
    "timestamp": datetime.now().isoformat()
}
result = client.publish(topic, json.dumps(payload), qos=1, retain=True)

# APRÈS (texte simple)
result = client.publish(topic, sunset_time, qos=1, retain=True)
```

Voici le script Json de base :

#!/usr/bin/env python3
"""
Script pour publier l'heure de coucher du soleil via MQTT
"""

import requests
from datetime import datetime
from zoneinfo import ZoneInfo
import paho.mqtt.client as mqtt
import json

# Configuration MQTT
MQTT_BROKER = "localhost"  # Adresse de votre broker MQTT
MQTT_PORT = 1883
MQTT_TOPIC = "home/sunset"
MQTT_CLIENT_ID = "sunset_publisher"
MQTT_USERNAME = "username"      # Remplacez par votre login
MQTT_PASSWORD = "mot_de_passe"  # Remplacez par votre mot de passe

# Configuration localisation - CROSSAC, France
LATITUDE = 47.4108
LONGITUDE = -2.1692
TIMEZONE = "Europe/Paris"  # Fuseau horaire français (gère CET/CEST automatiquement)

def get_sunset_time(lat, lon, timezone="Europe/Paris"):
    """
    Récupère l'heure de coucher du soleil via l'API sunrise-sunset.org
    Retourne l'heure en heure locale du fuseau horaire spécifié
    (gère automatiquement heure d'été/hiver)
    """
    url = f"https://api.sunrise-sunset.org/json?lat={lat}&lng={lon}&formatted=0"
    
    try:
        response = requests.get(url, timeout=10)
        response.raise_for_status()
        data = response.json()
        
        if data['status'] == 'OK':
            sunset_utc = data['results']['sunset']
            # Conversion en objet datetime UTC
            sunset_dt = datetime.fromisoformat(sunset_utc.replace('Z', '+00:00'))
            
            # Conversion en heure locale du fuseau horaire spécifié
            tz = ZoneInfo(timezone)
            sunset_local = sunset_dt.astimezone(tz)
            
            # Format avec indication du fuseau horaire
            heure_locale = sunset_local.strftime("%H:%M:%S")
            fuseau = sunset_local.strftime("%Z")  # CET ou CEST
            
            print(f"  Heure UTC: {sunset_dt.strftime('%H:%M:%S')} UTC")
            print(f"  Heure locale: {heure_locale} {fuseau}")
            
            return heure_locale
        else:
            return None
    except Exception as e:
        print(f"Erreur lors de la récupération du coucher de soleil: {e}")
        return None

def publish_sunset(broker, port, topic, lat, lon, timezone="Europe/Paris"):
    """
    Publie l'heure de coucher du soleil sur le topic MQTT
    """
    sunset_time = get_sunset_time(lat, lon, timezone)
    
    if sunset_time is None:
        print("Impossible de récupérer l'heure du coucher de soleil")
        return False
    
    # Création du payload
    payload = {
        "sunset_time": sunset_time,
        "latitude": lat,
        "longitude": lon,
        "timestamp": datetime.now().isoformat()
    }
    
    try:
        # Connexion au broker MQTT
        client = mqtt.Client(client_id=MQTT_CLIENT_ID)
        
        # Authentification
        client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
        
        client.connect(broker, port, 60)
        
        # Publication du message
        result = client.publish(topic, json.dumps(payload), qos=1, retain=True)
        
        if result.rc == mqtt.MQTT_ERR_SUCCESS:
            print(f"✓ Message publié sur {topic}")
            print(f"  Coucher du soleil: {sunset_time}")
            print(f"  Localisation: {lat}, {lon}")
            return True
        else:
            print(f"✗ Erreur lors de la publication: {result.rc}")
            return False
            
    except Exception as e:
        print(f"Erreur MQTT: {e}")
        return False
    finally:
        client.disconnect()

if __name__ == "__main__":
    # Exemple d'utilisation
    publish_sunset(
        broker=MQTT_BROKER,
        port=MQTT_PORT,
        topic=MQTT_TOPIC,
        lat=LATITUDE,
        lon=LONGITUDE,
        timezone=TIMEZONE
    )

Ce script a été en partie généré par Claude AI

Publications similaires

  • Colissimo : indemniser un envoi au delà de J+2

    Si vous utilisez les envois Colissimo en ligne et déposez le paquet en bureau de poste, soyez très attentif au suivi de votre envoi, en vérifiant en priorité s’il a bien été livré en J+2, c’est à dire 2 jours OUVRABLES (= pas dimanche, pas de jours fériés) après son dépôt, le tampon de La Poste étant une preuve irréfutable. S’il a été livré en J+3 ou plus, la procédure est simple : imprimez le suivi internet que vous avez…

  • |

    Informatique : touche à rien, ça fonctionne !!

    Si comme moi vous adorez trifouiller dans tout ce qui est technique, que ce soit électronique ou informatique, vous avez sans doute appris, avec les années, à tempérer votre ardeur et à laisser de côté ce qui fonctionnait. En effet, toucher à un système en production est une hyper-super-mauvaise idée !! Partant du vieux principe que quand ça fonctionne, on ne touche à rien, il est préférable d’attraper la petite vérole ou de se casser un ongle, plutôt que de…

  • SkyDSL : manque de souplesse ?

    Parfois j’ai l’impression de parler à un mur ! Prenons SkyDSL : j’ai demandé à basculer sur l’offre 10 MBps alors que la promotion à 19,90 € était en cours. Réponse ce matin : pas possible avant le 1er Aout, et je paierai plein tarif à ce moment là, soit 49,90 € mensuels !! Or, le changement m’avait été confirmé, SANS FRAIS, SANS CHANGEMENT DE TARIF par un conseiller clientèle partenaires que j’avais eu au téléphone… Imaginez le mécontentement ce…

  • Unifi : changer de contrôleur en ssh

    Vous avez décidé, comme moi, de déplacer votre contrôleur Unifi hébergé en ligne sur un autre serveur ? Après avoir exporté votre configuration, après l’avoir ré-importée sur le nouveau serveur, il va vous falloir effectuer un reset des bornes en place et leur indiquer ou envoyer la trame d’adoption (http://ip_du_serveur:8080/inform) pour qu’elles soient ré-intégrées par le nouveau serveur. Procédons dans l’ordre : Reset de la borne, un appui long sur le bouton reset suffit (20 secondes environ) Identification de l’IP…

  • |

    Gérez et recyclez vos accès WiFi

    Une question revient régulièrement : gérer les accès d’un réseau WiFi. Nous écarterons d’office les solutions basées sur un serveur Radius, car réservées à une poignée de férus de Linux. Idem pour les solutions proposées à bas prix par certains de nos confrères, qui vous lient indirectement à un fournisseur ou à un autre, gratuitement ou, hélas, souvent moyennant rémunération. Même combat pour les packs qui comportent un routeur wifi et une imprimante : on ne peut y brancher n’importe…

  • EdgeRouter et VLANs

    Il peut arriver de devoir installer plusieurs réseaux, totalement indépendants, séparés les uns des autres. Voici venu le moment de vous lancer dans les VLANs, des réseaux virtuels qui transitent simultanément sur vos liaisons ethernet, voir WiFi. Première étape, vous munir d’un routeur adapté, tel l’EdgeRouter Lite et ses 3 ports ethernet : Ce routeur va nous servir à générer les VLANs, mais également le serveur DHCP qui sera affecté à chaque VLAN : souvenez-vous, un VLAN, un réseau, et donc…

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.