Baptiste Zahnow

Créer par: Baptiste Zahnow, 24/12/2025 11:50
Tables des matières
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:
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.
| Nom | Valeur | Description |
|---|---|---|
ra | 0 | On ne sais pas vraiment çe que ça veux dire |
ran0 | 1 | Surement le mode de couleurs à envoyer |
ran5 | 254 | Le canal rouge du projecteur |
ran6 | 0 | Le canal vert du projecteur |
ran7 | 0 | Le canal bleu du projecteur |
ran8 | 0 | Le canal blanc du projecteur |
ran9 | 0 | Le canal 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 = 255g = 125b = 0w = 132a = 75
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.
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:
| Noms | Description |
|---|---|
ran0..ran4 | Les champs d'option pour les projecteurs, par exemple la fonction utilisé et l'intensité |
ran5..ran9 | Les canaux RGBWA pour le premier projecteur |
ran10..ran14 | Les canaux RGBWA pour le second projecteur |
ran15..ran19 | Les canaux RGBWA pour le troisième projecteur |
ran20..ran24 | Les canaux RGBWA pour le quatrième projecteur |
ran25..ran29 | Les 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 + 25 où a doit être au dessus de 100.
Avec cela on peut déjà commencé à mettre en place le type de structure de couleurs:
/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:
/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:
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 !
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
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é:
/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.
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.
<- Précedent
// 01
Suivant ->
// 02
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é.