logo

Baptiste Zahnow

blog cover image
<- Retour au blog

Est-ce possible de changer la couleur du château de Duras depuis le terminal ?

Créer par: Baptiste Zahnow, 24/12/2025 11:50

Tables des matières


Brainstorm

J'ai eu cette idée quand je suis passé devant le château de Duras, lors des vacances d'hiver. Je savais déjà qu'il existait un site officiel mis en place pour changer les couleurs du château, mais je n'avais pas l'oeil technique à ce moment là. J'ai décidé de me lancer dans la recherche sur comment le site fonctionne et comment pouvoir mettre ce système à mon profis en créent un CLI pour changer la couleur du château depuis mon terminal. Rendons-nous sur le site internet.

Appuions sur la couleur rouge et voyons ce qu'il en sort:

bash icon

link

copy code

https://www.duras.mobi/couleurs.php?ra=0&ran0=1&ran5=254&ran6=0&ran7=0&ran8=&ran9=0

On finis avec plusieurs valeurs dans une requête GET sur le fichier couleur.php. Beaucoups de variables sont mise en place lorsque l'on appuie sur la couleur rouge.

NomValeurDescription
ra0On ne sais pas vraiment çe que ça veux dire
ran01Surement le mode de couleurs à envoyer
ran5254Le canal rouge du projecteur
ran60Le canal vert du projecteur
ran70Le canal bleu du projecteur
ran80Le canal blanc du projecteur
ran90Le canal ambre du projecteur

Comment est-ce que je peux être sur que cela sont les canaux rouge, vert, bleu, blanc, ambre du projecteur ?

Le site internet à aussi une page pour pouvoir créer ses propre couleurs. Sur celle-ci on vois les plusieurs champs qui sont disponible pour la création des couleurs, dont: rouge, vert, bleu, blanc, ambre. Ce format de couleurs est très connu pour les projecteurs de lumières.


Mais lors de la création d'une couleurs RGBWA, disons par exemple:

  • r = 255
  • g = 125
  • b = 0
  • w = 132
  • a = 75
image des canaux disponible sur le site

dans la requête faites pour envoyer les couleurs, on retrouve plusieurs canaux, qui peux faire penser que l'on peux changer la couleurs pour chaque projecteurs différent.

bash icon

link

copy code

https://www.duras.mobi//couleur.php?ran0=1&=&ran1=255&ran2=&ran3=&ran4=&ran5=255&ran6=125&ran7=0&ran8=132&ran9=75&ran10=255&ran11=125&ran12=0&ran13=132&ran14=75&ran15=255&ran16=125&ran17=0&ran18=132&ran19=75&ran20=255&ran21=125&ran22=0&ran23=132&ran24=100&ran25=255&ran26=125&ran27=0&ran28=132&ran29=75

J'ai rechercher comment je pourrais les regrouper et j'ai trouvé une façon plutôt cohérente:

NomsDescription
ran0..ran4Les champs d'option pour les projecteurs, par exemple la fonction utilisé et l'intensité
ran5..ran9Les canaux RGBWA pour le premier projecteur
ran10..ran14Les canaux RGBWA pour le second projecteur
ran15..ran19Les canaux RGBWA pour le troisième projecteur
ran20..ran24Les canaux RGBWA pour le quatrième projecteur
ran25..ran29Les canaux RGBWA pour le cinquième projecteur

On peut remarqué que tout les canaux RGBWA on la même valeurs, à part pour la couleur ambre du quatrième projecteur, qui, soit prends a + 25a doit être au dessus de 100.

PoC (Proof of Concept)

Avec cela on peut déjà commencé à mettre en place le type de structure de couleurs:

golang icon

/internal/colors/rgbwa.go

copy code

package colors

type RGBWA struct {
    Red int
    Green int
    Blue int
    White int
    Amber int
}

func NewRGBWA(red int, green int, blue int, white int, amber int) *RGBWA {
    return &RGBWA{ Red: red, Green: green, Blue: blue, White: white, Amber: amber }
}

Pour un projecteur, on peux aussi mettre ces valeurs:

golang icon

/internal/projector/projector.go

copy code

package projector

import "github.com/LelouchFR/duras-castle-color-changer-cli/internal/colors"

type Projector struct {
    Color colors.RGBWA
}

func NewProjector(color colors.RGBWA) *Projector {
    return &Projector{
        Color: color,
    }
}

Avec ceci mis en place, on peut maintenant mettre les valeurs ensemble puis refaire une requête:

golang icon

main.go

copy code

package main

import (
    "fmt"
    "net/http"

    "github.com/LelouchFR/duras-castle-color-changer-cli/internal/colors"
    "github.com/LelouchFR/duras-castle-color-changer-cli/internal/projector"
)

func main() {
    colorPage := "https://www.duras.mobi/couleur.php"
    colorMode := 1
    colorIntensity := 255
    color := colors.NewRGBWA(255, 125, 0, 132, 75)
    secondColor := colors.NewRGBWA(255, 125, 0, 132, 100)

    projectorGroup := []projector.Projector{
        *projector.NewProjector(*color),
        // ... ajout des couleurs sur tout les projecteurs
    }

    res, err := http.Get(fmt.Sprintf(
        "%s?ran0=%d&=&ran1=%d&ran2=&ran3=&ran4=&ran5=%d&ran6=%d&ran7=%d&ran8=%d&ran9=%d&ran10=%d&ran11=%d&ran12=%d&ran13=%d&ran14=%d&ran15=%d&ran16=%d&ran17=%d&ran18=%d&ran19=%d&ran20=%d&ran21=%d&ran22=%d&ran23=%d&ran24=%d&ran25=%d&ran26=%d&ran27=%d&ran28=%d&ran29=%d",
        colorPage, colorMode, colorIntensity,
        projectorGroup[0].Color.Red, projectorGroup[0].Color.Green, projectorGroup[0].Color.Blue, projectorGroup[0].Color.White, projectorGroup[0].Color.Amber,
        // ... sur toutes les valeurs
    ))
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    if res.StatusCode != 200 {
        panic("Duras Color API is not available")
    }

    fmt.Println(res)
}

La requête passe, Le chateau de Duras change de couleur !

bash icon

link

copy code

200 OK
200 HTTP/2.0 2 0 map[Content-Length:[0]
Content-Type:[text/html; charset=us-ascii]
Date:[Wed, 24 Dec 2025 13:33:07 GMT]
Server:[nginx]] {} 0 [] false false map[] 0xc0000ee000 0xc000183740

Création du CLI

Maintenant que l'on a réussi à recevoir une réponse positive avec le PoC (Proof of Concept), nous pouvons nous lancer sur la création du cli. Je refactorise le code pour mettre la création de requetes dans le fichier /internal/api/send.go.

Pour le cli on va utilisé bubbletea un tui maker pour golang.

J'ai ajouter la possibilité d'avoir des presets pour pouvoir ajouter des couleurs prédéfini, mais aussi une possibilité de customibilisé les couleurs qui sont envoyé:

golang icon

/internal/presets/data.go

copy code

package preset

import "github.com/LelouchFR/duras-castle-color-changer-cli/internal/colors"

var Presets = []Preset{
    {
        Name: "France",
        Colors: []*colors.RGBWA{
            colors.NewRGBWA(0, 0, 255, 125, 75),
            // ... fois 5
        },
    },
    // ...
    {
        Name: "Custom",
        Colors: []*colors.RGBWA{
            colors.NewRGBWA(0, 0, 0, 0, 0),
            // ... fois 5
        },
    },
}

Les couleurs seront dans une liste dans laquelle on peux choisir au lancement du cli. pour choisir entre la view où l'on peut mettre ses propre valeurs et celle où il y a les presets, le fichier view.go gère le fonctionnement, pour plus d'information sur le Model, vous pouvez voir le projet sur GitHub. Pour passer sur la view custom pour mettre ses valeurs, on peut choisir le preset Custom qui est un preset avec les valeurs de couleurs qui sont tous à 0. Les valeurs seront changer au moment où l'on les rentre dans la vue.

Résultat final

En partant d'une simple observation sur le site officiel, un peu de rétro-ingénierie et de curiosité, j'ai réussi à comprendre la structure de l'API et la modélisation de ses données pour en faire un CLI.

Ce projet illustre surtout combien des systèmes qui semblent fermés peuvent être explorés et compris grâve à des outils et une bonne méthodologie. L'objectif n'était pas uniquement de modifier des lumières, mais aussi de bâtir quelque chose de soigné, réutilisable et agréable à utiliser.

Bien sûr, ce type d'expérimentation doir rester dans un cadre respectueux et strictement technique. Mais c'est également ce qui rend ce genre de projet captivant, transformer une idée farfelue en un outil concret qui fonctionne réellement. Et soyons honnêtes, contrôler la couleur d'un château depuis un terminal a tout de même une certaine classe.

image from the galery
image from the galery
image from the galery

Information sur les cookies

Ce site utilise un cookie strictement nécessaire au fonctionnement de l’espace commentaires.
Ce cookie est créé lors de la connexion via Google afin de maintenir votre session et vous permettre de publier des commentaires.
Aucun cookie publicitaire ou de suivi n’est utilisé.