|

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

  • Coup de pouce : Apolzart.fr, artiste peintre

    Une fois n’est pas coutume, un coup de pouce vers un site mis en place et hébergé par Infracom : apolzart.fr Je vous l’accorde, ce site est bien éloigné de notre domaine d’activité puisqu’il s’agit du site d’un artiste peintre, Yves Schneider, mais après tout, le plaisir ne nait-il pas de la différence ? 🙂 Il met en avant ses nombreuses toiles et communiquera régulièrement sur l’actualité de l’artiste : expositions, astuces, nouvelles toiles, etc. Chaque toile est unique et…

  • Livraison décalée

    Nous avons un peu de retard dans les expéditions suite aux grèves d’hier : comme à chaque fois, nous avons préféré ne pas injecter les envois dans le réseau postal alors qu’il était fortement perturbé, évitant des pertes comme ce fût hélas le cas par le passé… C’est là un conseil de Coliposte que nous suivons à la lettre, c’est le cas de le dire 😉 Tous les colis en souffrance vont donc être présentés d’ici une petite heure, livraison…

  • Raspberry Pi 3 et Unifi 5.2.0.1

    Profitant d’un WE peu chargé, voici le moment idéal pour tester la nouvelle version Beta du contrôleur Unifi sur un simple Raspberry Pi 3. Il faut dire que la version publique tournait depuis un moment, sans failles. 3 bornes locales sont alors déplacées d’un contrôleur cloud vers le gestionnaire local : une picostation avec le firmware Unifi une Unifi 2.4 GHz une Unifi 802.11ac validée exclusivement en 5 GHz Force est de constater que ça tourne rond, les essais de…

  • Concarneau en Wimax

    Le Wimax est disponible dans les zones blanches proches de Concarneau. C’est ce qu’indique un article assez complet dans Ouest France, évoquant les installations, les coûts, mais également cette fausse polémique déclenchée par les Robins de Toits, je cite :  » Ondes dangereuses ? Certaines associations, comme Robin des toits, militent contre la Wimax, craignant un danger des ondes pour la santé. Les mesures concernant les stations Wimax dans le Finistère ont été confiées à un laboratoire certifié et indépendant, selon…

  • |

    Du recul sur #freemobile

    Je suis effaré quand je lis que Freemobile gagne toujours des clients, mais surtout j’aurais aimé comprendre QUELS CLIENTS : ceux qui surfent ou ceux qui téléphonent ? Ceux qui vont payer 20 € ou ceux qui profitent du forfait à 2 €, le moins cher du marché ? Car dans le premier cas, aller chez Freemobile pour espérer surfer, c’est aussi dingue que d’écouter des mecs vierges vêtus d’une robe longue vous donner des leçons d’amour et de sexualité….

  • AirCam : toute la gamme est en boutique !

    La gamme des caméras Aircam d’Ubiquiti est désormais en ligne sur notre boutique. Rappelons que trois modèles sont disponibles : un modèle étanche, extérieur : un modèle à fixer sur un plafond : un modèle à poser sur une table : Toutes ces caméras disposent d’une résolution de 720p HD et sont gérées par le logiciel AirVision, fourni gratuitement avec chaque caméra et régulièrement remis à jour par les équipes d’Ubiquiti. Ce logiciel, sous Windows XP ou 7 permet l’enregistrement,…

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.