Files
arnaudne 941abd98d5 feat: initial myprimal MQTT bridge service
Dynamic MySolem/MyIndygo IoT bridge with MQTT, Home Assistant
autodiscovery, and Homebridge EasyMQTT compatibility.

- Device discovery via MySolem API on startup (all modules/inputs/outputs)
- Configurable poll engine (fast/normal/slow buckets, per-input overrides)
- MQTT retained state publishing + HA autodiscovery payloads
- Unified manual command routing (linesControl vs sendManualModuleCommand)
- Runtime config via MQTT $config/set, persisted to config.json
- Expression override system (API-provided > hardcoded > passthrough)
- Minimal REST API: /health, /state, /control, /rediscover
- Docker deployment (Dockerfile + docker-compose.yml)
- 38 unit tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 01:05:24 +02:00

5.4 KiB
Raw Permalink Blame History

MySolem / MyIndygo API — Overview

Platform Base URL Focus
MySOLEM https://qualif.mysolem.com Irrigation, garden sensors
MyIndygo https://qualif.myindygo.com Pool control, water chemistry

Both platforms share the same backend database and API — same module IDs, input IDs, session cookie. MyIndygo adds pool-specific management endpoints on top.
See api-docs/myindygo.md for MyIndygo-specific docs.

Backend: Node.js + Sails.js v0.13.8 socket client, MongoDB (all IDs are 24-char hex ObjectIds)
Real-time: Socket.IO v3 / Engine.IO v3 (EIO=3), direct WebSocket transport (not long-polling), wss://qualif.mysolem.com/socket.io/
Proxy: nginx/1.18.0 (Ubuntu) in front


Authentication

Two separate auth systems exist on the same server:

  • Web API (no path prefix): session cookie (Sails.js), no CSRF required on JSON endpoints
  • Mobile API (/api/ prefix): OAuth2 Bearer token (grant_type: client_credentials)

See api-docs/mobile-api.md for the mobile API auth flow.

Web login flow

# Step 1: initialize cookie jar
curl -c cookies.txt https://qualif.mysolem.com/login

# Step 2: authenticate
curl -c cookies.txt -b cookies.txt \
  -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "email=YOUR_EMAIL&password=YOUR_PASSWORD" \
  "https://qualif.mysolem.com/login"

# All subsequent calls
curl -b cookies.txt https://qualif.mysolem.com/features

Cookie name: qualification-mysolem-solem-irrigation-platform.sid
Session TTL: ~7 days
No CSRF token required on JSON endpoints.

Python example

import requests

BASE = "https://qualif.mysolem.com"
s = requests.Session()

s.get(f"{BASE}/login")                          # init cookie
s.post(f"{BASE}/login", data={
    "email": "...",
    "password": "...",
})                                              # 302 → / on success

# Now s carries the session cookie automatically
sites = s.get(f"{BASE}/canopy-sites", params={"userId": USER_ID}).json()

Key IDs (test account)

Resource Name ID Serial Number
User (MySOLEM) Arnaud Nelissen 5de53bca7ed4c45c2cfe067f
User (MyIndygo) Arnaud Nelissen (API account) 6a21c3db5ebe0fa5f7885460
Site Domicile 62b30d26ecbceb08607592c1
Gateway module LRMB10-070532 60ca4276ad69dac1558f7c61 1000000705320001
Sensor station module LRMS-0721DC 60ca42adad69dac1558f7c64 7400040721DC0001
Agricultural valve module LR6AG-070917 626984f038ec558c598bb6d5 6606010709170001
Pool analyser module LRPS-0565C0 6480da07c2c0896da120ecca 9400030565C00001
Pool ctrl module LRPC-F1DA27 6481bcea8782b78554c02bed 150302F1DA270001
IP ECO module LR2IPECO-0C9282 6516ca57b7c098e6807cb332 3802020C92820001
Filter pressure sensor LRPR-0D6800 6a17218be0b88ea3e925524f 1D00010D68000001
Pool level switch POOL-LVL-0E953B 6a174dd1e0b88ea3e925531c 0300020E953B0001
Level ctrl module LRLEVEL-0D2ED9 6a1c4b153d6c33ab843edc13 3A01020D2ED90001
Input: Soil moisture (Plumbago) 60ca42adad69dac1558f7c66
Input: Sensor 2 60ca42adad69dac1558f7c67
Input: Sensor 3 60ca42adad69dac1558f7c69
Input: Rain sensor (AG) 626984f038ec558c598bb6d7
Input: Pool temperature (LRPS) 6480da07c2c0896da120eccc
Input: Pool pH (LRPS) 6480da07c2c0896da120eccd
Input: Pool ORP/Redox (LRPS) 6480da07c2c0896da120ecce
Input: Rain sensor (LRAG) 626984f038ec558c598bb6d7
Input: Moisture — Plumbago (LRMS) 60ca42adad69dac1558f7c66
Input: Moisture — Pelouse (LRMS) 60ca42adad69dac1558f7c67
Input: Temperature (LRMS) 60ca42adad69dac1558f7c69
Input: Flow meter (LRIPECO) 6516ca57b7c098e6807cb334
Input: Filter pressure (LRPR) 6a17218be0b88ea3e9255251
Input: Pool level switch (POOL-LVL) 6a174dd1e0b88ea3e925531e
Input: Pool level switch aux (POOL-LVL) 6a174dd1e0b88ea3e925531f
Input: Fill volume (LRLEVEL) 6a1c4b153d6c33ab843edc15
Input: Fill valve state (LRLEVEL) 6a1c4b153d6c33ab843edc16
Output: Station 1 (AG) Station 1 626984f038ec558c598bb6d8
Output: Station 2 (AG) Station 2 626984f038ec558c598bb6d9

Module types

Type string Description
lr-mb-10 LoRa relay / gateway
lr-ms LoRa sensor station
lr-ag LoRa agricultural valve
lr-mas LoRa master valve
lr-pc LoRa pool controller
lr-ip-eco LoRa IP ECO
lr-pr LoRa pressure sensor (filter)
pool-level-sensor Pool float level switch
lr-niv LoRa level controller (fill valve)
wf-mb WiFi gateway
wf-is / bl-is WiFi/BT sensor
bl-ip BT IP
wf-ol WiFi online

Input type codes

Code Meaning Unit
2 TOR (on/off, e.g. rain sensor)
5 Air/soil temperature °C
6 pH — (raw ÷ 100)
7 ORP / Redox mV
8 Pressure bar (unit 6, expression: (1.5×raw500)/1000)
12 Soil moisture % (unit 10)
20 Air moisture
21 Pool level TOR switch raw 0/1
33 Volumetric / flow L (unit 1)
133 Water temperature °C (unit 2)
149 Fill valve / level state raw 0/1