Plugin SPA Intex

Bonjour à tous,

Savez vous si un plugin Intex est en création? En effet depuis 2021, certain SPA sont connecté à internet et pilotable depuis une appli mobile.

Salut
Non pas de plugin mais ca pourrait m’intéresser.
C’est l’appli pour quel modèle de spa?

Carbone 6 places. Ça permettrai de lancer le chauffage quand les panneaux solaires donnent ! Même payante j’achète!

Intéressé aussi, je ne trouve aucune informations à ce sujet…

1 « J'aime »

Hello

Pas de plugin mais pilotable en Python grâce à l’excellent boulot de Mathieu-mp
https://github.com/mathieu-mp/intex-spa

La liste pour identifier les spa compatibles https://github.com/mathieu-mp/intex-spa/issues/15

Je viens de rajouter le mien aujourd’hui en attente d’update du tableau

Intex Pure Spa Chevron 4 places - modèle 2023

User manual Ref : PureSpa SB-HSWF20
Name on Intex App : Bubble SPA Plus3380
Intex spa réf : 28446EX
bubble / sanitizer

Exécution des ordres immédiat ça marche franchement bien

Par contre l’appli, une grosse daube, il n’y a que regarder les avis sur les stores.
J’ai galéré un max pour l’appairer, je ne sais pas ce qui a fait que c’est passé, mais sur mon asus, désactivation AIprotection, Firewall, filtrer l’ip dans OpenVPN et activation upnp et configuration sur le ssid 2,4Ghz , il n’est pas compatible 5Ghz
Après découverte, j’ai tout remis et maintenant la connexion wifi est stable

Super! Pense tu qu’un plugin arrivera pour les novice comme moi?
En effet l’appli Intex c’est une catastrophe !

J’espère, pour l’instant beaucoup d’huiles de coude mais actions instantanées , ça change de l’appli !
Petit rendu à ce stade avec pleins d’amélioration visuelle à faire, maintenant il est temps de se tremper :grin:

Super! Bravo pour le boulot!

Bonjour,

Peux-tu partager ton script?

Merci d’avance

En début de post, j’ai mis le git de Mathieu-mp

En ssh sur votre jeedom
python3 -m pip install -U intex-spa

vi /etc/hosts
Ajouter l’ip de votre spa :
192.168.2.xxx SPA_DEVICE

Récupérer tous les scripts examples sur https://github.com/mathieu-mp/intex-spa/tree/main/examples

Les copier dans /var/www/html/plugins/script/data/spa
Renommer les extensions py en .PY

Vous pouvez tester déjà en ligne de commande si vous récupérer des infos
python3 /var/www/html/plugins/script/data/spa/intex_spa_get_info.PY

Ensuite mes compétences étant faible, j’ai mis dans le plugin script les actions :

Spa_On : python3 /var/www/html/plugins/script/data/spa/intex_spa_set_power_on.PY

Spa_Off : python3 /var/www/html/plugins/script/data/spa/intex_spa_set_power_off.PY

etc…

Et pour récupérer les infos (beurk mais pas eu le temps de chercher)

2 actions
Spa_infos : python3 /var/www/html/plugins/script/data/spa/spa intex_spa_get_info.PY > /var/www/html/plugins/script/data/spa/infos.log

Spa_infos_log : cat /var/www/html/plugins/script/data/spa/infos.log | grep current

Ca permet de récupérer cette chaîne dans Spa_infos_log

{'power': True, 'filter': True, 'heater': False, 'jets': False, 'bubbles': False, 'sanitizer': True, 'unit': '°C', 'current_temp': 32, 'preset_temp': 31, 'error_code': False}

Et un scénario avec un bloc code :


// la commande info autre
cmd::byString('#[Extérieur][S_Spa][Spa_infos]#')->execCmd(); // execute la commande statut
$cmdinfo = "#[Extérieur][S_Spa][Spa_infos_logs]#"; // lit le log
$RetourInfo = cmd::byString($cmdinfo)->execCmd(); // stock le log

// scinde l'info avec le delimiteur
list($val1, $val2,$val3,$val4,$val5,$val6,$val7,$val8,$val9,$val10) = explode(',', $RetourInfo);

// mise en variable
$scenario->setData("spa_power", "$val1");
$scenario->setData("spa_filter", "$val2");
$scenario->setData("spa_heater", "$val3");
$scenario->setData("spa_bubble", "$val5");
$scenario->setData("spa_sanitizer", "$val6");
$scenario->setData("spa_unit", "$val7");
$scenario->setData("spa_current_temp", "$val8");
$scenario->setData("spa_preset_temp", "$val9");
$scenario->setData("spa_error", "$val10");



// le log
$scenario->setLog("info : $RetourInfo");
$scenario->setLog("spa_power : $val1");
$scenario->setLog("spa_filter : $val2");
$scenario->setLog("spa_heater : $val3");
$scenario->setLog("spa_bubble : $val5");
$scenario->setLog("spa_sanitizer : $val6");
$scenario->setLog("spa_unit : $val7");
$scenario->setLog("spa_current_temp : $val8");
$scenario->setLog("spa_preset_temp : $val9");
$scenario->setLog("spa_error : $val10");

Et pour les infos des virtuels pour récupérer les variables avec un peu de nettoyage à faire
Exemple :
current_temp info/autres substr(variable(spa_current_temp),15)

En espérant que cela vous donne des pistes, je fais à l’arrache :grinning:
Tout est peut être possible en bloc code…

J’ai pas mal avancé. je n’ai pas eu à passer par le fichier log intermediaire en utilisant directement le script status et j’ai adapté le scenario.
Il me reste de la cosmétique au niveau graphique

image

Merci pour le boulot

1 « J'aime »

Cool ! Ça prend forme :slight_smile:
Et là au moins c’est super réactif

J’ai tout mis dans un planning pour la filtration et désinfection mais qq chose que je viens de voir ce matin, même si tu veux filtrer pendant 10h, le spa se met avec un compte à rebours et le max est 6h. Donc à relancer …

Tu peux partager pour le script status et scénario car pas joli joli ce que j’ai fait !

Beau visuel ! Manque plus qu’à trouver un moyen d’inclure le script preset en bloc code pour pouvoir choisir la température souhaitée via un slider… peut être un plugin un jour :grin:

Un plugin, un plugin, un plugin ! :smile:
Franchement même payant, j’achète!

Je fais du menage dans mon code, je tente de faire le slider pour la temperature et ensuite, je partage.

Voilà un peu de details
Amusez-vous bien et n’oubliez pas de mettre des auto-actualisation fiable pour avoir un pseudo temp-reel

Le scenario

// Get data using status script

$cmdinfo = "#[Jardin][Spa][spa_status]#";
$RetourInfo = cmd::byString($cmdinfo)->execCmd();
$scenario->setLog("Retour Info : " . $retourInfo);

// Get indidual data
list($val1, $val2,$val3,$val4,$val5,$val6,$val7,$val8,$val9,$val10) = explode(',', $RetourInfo);

// Set variables
$scenario->setData("spa_power", substr($val1,strrpos($val1,": ")+2,));
$scenario->setData("spa_filter", substr($val2,strrpos($val2,": ")+2,));
$scenario->setData("spa_heater", substr($val3,strrpos($val3,": ")+2,));
$scenario->setData("spa_jet", substr($val4,strrpos($val4,": ")+2,));
$scenario->setData("spa_bubble", substr($val5,strrpos($val5,": ")+2,));
$scenario->setData("spa_sanitizer", substr($val6,strrpos($val6,": ")+2,));
$scenario->setData("spa_unit", substr($val7,strrpos($val7,": ")+2,));
$scenario->setData("spa_current_temp", substr($val8,strrpos($val8,": ")+2,));
$scenario->setData("spa_preset_temp", substr($val9,strrpos($val9,": ")+2,));
$pos = strrpos($val10,": ");
$len = strlen($val10)-$pos-3;
$sub = substr($val10,$pos+2,$len);
$scenario->setData("spa_error", $sub);



// Show Variables

$scenario->setLog($scenario->getData("spa_power"));
$scenario->setLog($scenario->getData("spa_filter"));
$scenario->setLog($scenario->getData("spa_heater"));
$scenario->setLog($scenario->getData("spa_bubble"));
$scenario->setLog($scenario->getData("spa_jet"));
$scenario->setLog($scenario->getData("spa_sanitizer"));
$scenario->setLog($scenario->getData("spa_unit"));
$scenario->setLog($scenario->getData("spa_current_temp"));
$scenario->setLog($scenario->getData("spa_preset_temp"));
$scenario->setLog($scenario->getData("spa_error"));

Le résultat averc mes info provenant de mon Flipr

image

Le virtuel

et les scripts

J’ai creer un nouveau fichier PY pour passer la temperature en parametre
intex_spa_set_preset_temp.PY

import os
import logging
import asyncio
import sys

from intex_spa.intex_spa import IntexSpa

SPA_ADDRESS = os.getenv("SPA_ADDRESS") or "SPA_DEVICE"


async def example_intex_spa():
    """Example for intex_spa"""
    intex_spa = IntexSpa(SPA_ADDRESS)
    n = int(sys.argv[1])

    print(await intex_spa.async_set_preset_temp(n))


asyncio.run(example_intex_spa())

Nickel, limpide ! Merci pour ton partage, bcp plus simple ! (Et j’apprends en même temps :grin:)

Merci @networks514 et @patrice_payen pour votre taff !

Je pense que je passe à coté d’un truc « facile » mais la je bloque :sweat_smile:

Je souhaiterais faire un bouton du type « Toggle » avec le retour d’état du SPA pour la mise en marche des bulles, jets, etc…

J’ai essayé plein de truc dans mon virtuel mais je n’arrive à rien.

Une idée ?
Merci :slight_smile:

Bonjour à tous,

J’aimerai piloter mon spa Intex et j’ai donc suivi la procédure décrite ici. Mon jeedom est installé sur Pi4 sous Buster ; je suis à jour côté jeedom.
Mais je bute dès le départ quand je veux tester une des commandes en ssh, j’ai l’erreur :

jeedom@jeedom:~ $ python3 /var/www/html/plugins/script/data/spa intex_spa_get_info.PY
/usr/bin/python3: can't find '__main__' module in '/var/www/html/plugins/script/data/spa'

Je crois que l’installation ne s’est pas passée correctement, voilà ce que j’obtiens quand je lance la commande sous ssh : python3 -m pip install -U intex-spa

jeedom@jeedom:~ $ sudo python3 -m pip install -U intex-spa
[sudo] Mot de passe de jeedom : 
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: intex-spa in /usr/local/lib/python3.7/dist-packages (0.8.3)
Requirement already satisfied: asyncio in /usr/local/lib/python3.7/dist-packages (from intex-spa) (3.4.3)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
--- Logging error ---
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/utils/logging.py", line 177, in emit
    self.console.print(renderable, overflow="ignore", crop=False, style=style)
  File "/usr/local/lib/python3.7/dist-packages/pip/_vendor/rich/console.py", line 1752, in print
    extend(render(renderable, render_options))
  File "/usr/local/lib/python3.7/dist-packages/pip/_vendor/rich/console.py", line 1390, in render
    for render_output in iter_render:
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/utils/logging.py", line 134, in __rich_console__
    for line in lines:
  File "/usr/local/lib/python3.7/dist-packages/pip/_vendor/rich/segment.py", line 245, in split_lines
    for segment in segments:
  File "/usr/local/lib/python3.7/dist-packages/pip/_vendor/rich/console.py", line 1368, in render
    renderable = rich_cast(renderable)
  File "/usr/local/lib/python3.7/dist-packages/pip/_vendor/rich/protocol.py", line 36, in rich_cast
    renderable = cast_method()
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/self_outdated_check.py", line 130, in __rich__
    pip_cmd = get_best_invocation_for_this_pip()
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/utils/entrypoints.py", line 60, in get_best_invocation_for_this_pip
    os.path.join(binary_prefix, exe_name),
  File "/usr/lib/python3.7/genericpath.py", line 97, in samefile
    s2 = os.stat(f2)
FileNotFoundError: [Errno 2] Aucun fichier ou dossier de ce type: '/usr/bin/pip3.7'
Call stack:
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/local/lib/python3.7/dist-packages/pip/__main__.py", line 31, in <module>
    sys.exit(_main())
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/main.py", line 70, in main
    return command.main(cmd_args)
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/base_command.py", line 101, in main
    return self._main(args)
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/base_command.py", line 223, in _main
    self.handle_pip_version_check(options)
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/req_command.py", line 148, in handle_pip_version_check
    pip_self_version_check(session, options)
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/self_outdated_check.py", line 237, in pip_self_version_check
    logger.info("[present-rich] %s", upgrade_prompt)
  File "/usr/lib/python3.7/logging/__init__.py", line 1383, in info
    self._log(INFO, msg, args, **kwargs)
  File "/usr/lib/python3.7/logging/__init__.py", line 1519, in _log
    self.handle(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 1529, in handle
    self.callHandlers(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 1591, in callHandlers
    hdlr.handle(record)
  File "/usr/lib/python3.7/logging/__init__.py", line 905, in handle
    self.emit(record)
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/utils/logging.py", line 179, in emit
    self.handleError(record)
Message: '[present-rich] %s'
Arguments: (UpgradePrompt(old='22.1.2', new='23.1.2'),)

Je ne sais pas si c’est normal, ça me dépasse…
J’ai quand même essayer les scripts sous jeedom mais, évidemment, ça n’a pas marché…
Help…

Edit : en fait, les commandes fonctionnent en script ! :smiley:
Je n’arrive pas à récupérer les infos du spa mais je continue de creuser :

DEBUG:asyncio:Using selector: EpollSelector INFO:intex_spa.intex_spa:Initializing IntexSpa instance... INFO:intex_spa.intex_spa:IntexSpa instance initialized DEBUG:intex_spa.intex_spa:'info' intent: Handling new intent... DEBUG:intex_spa.intex_spa:'info' intent: a spa query is needed DEBUG:intex_spa.intex_spa:'info' intent: new spa query... INFO:intex_spa.intex_spa_network_layer:Not connected to the spa, trying to connect... DEBUG:intex_spa.intex_spa_network_layer:Opening TCP connection with the spa at SPA_DEVICE:8990 with asyncio... INFO:intex_spa.intex_spa_network_layer:TCP connection established with the spa DEBUG:intex_spa.intex_spa_network_layer:Sending bytes to the spa: b'{"data": "0", "sid": "16866589018002", "type": 3}' DEBUG:intex_spa.intex_spa_network_layer:Receiving bytes from the spa: b'{"sid":"16866589018002","data":"{\\"ip\\":\\"192.168.6.101\\",\\"uid\\":\\"0K040210312020122300023717\\",\\"dtype\\":\\"spa\\"}","result":"ok","type":3}\n' DEBUG:intex_spa.intex_spa_object_info:Spa info: '{'ip': '192.168.6.101', 'uid': '0K040210312020122300023717', 'dtype': 'spa'}' DEBUG:intex_spa.intex_spa:'info' intent: new info is rendered {'ip': '192.168.6.101', 'uid': '0K040210312020122300023717', 'dtype': 'spa'}"
Résultat : "DEBUG:asyncio:Using selector: EpollSelector INFO:intex_spa.intex_spa:Initializing IntexSpa instance... INFO:intex_spa.intex_spa:IntexSpa instance initialized DEBUG:intex_spa.intex_spa:'info' intent: Handling new intent... DEBUG:intex_spa.intex_spa:'info' intent: a spa query is needed DEBUG:intex_spa.intex_spa:'info' intent: new spa query... INFO:intex_spa.intex_spa_network_layer:Not connected to the spa, trying to connect... DEBUG:intex_spa.intex_spa_network_layer:Opening TCP connection with the spa at SPA_DEVICE:8990 with asyncio... INFO:intex_spa.intex_spa_network_layer:TCP connection established with the spa DEBUG:intex_spa.intex_spa_network_layer:Sending bytes to the spa: b'{"data": "0", "sid": "16866589018002", "type": 3}' DEBUG:intex_spa.intex_spa_network_layer:Receiving bytes from the spa: b'{"sid":"16866589018002","data":"{\\"ip\\":\\"192.168.6.101\\",\\"uid\\":\\"0K040210312020122300023717\\",\\"dtype\\":\\"spa\\"}","result":"ok","type":3}\n' DEBUG:intex_spa.intex_spa_object_info:Spa info: '{'ip': '192.168.6.101', 'uid': '0K040210312020122300023717', 'dtype': 'spa'}' DEBUG:intex_spa.intex_spa:'info' intent: new info is rendered {'ip': '192.168.6.101', 'uid': '0K040210312020122300023717', 'dtype': 'spa'}

Hello

Effectivement tu as un pb avec Python

Tu peux toujours essayer de mettre à jour
pip install --upgrade pip

Et si cela ne marche toujours pas
pip config set global.disable-pip-version-check true

Et tu réinstalles
python3 -m pip install -U intex-spa

Évidemment, de nombreux plugins s’appuyant sur python et il n’est pas impossible que certains plantent après et que tu sois obligé de réinstaller des dépendances pour les plugins qui les gèrent

A+

Hello @networks514

Merci d’avoir pris la peine de me répondre. :slight_smile:
J’ai donc tenté les manips ci-dessus, j’ai fait un reboot, mais sans succès.
Il semblait y avoir une amélioration au niveau des erreurs sur l’installation de intex-spa mais toujours pas de remontée des infos :

jeedom@jeedom:~ $ python3 /var/www/html/plugins/script/data/spa intex_spa_get_in                                                                                                             fo.PY
/usr/bin/python3: can't find '__main__' module in '/var/www/html/plugins/script/                                                                                                             data/spa'
jeedom@jeedom:~ $ pip install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: pip in /usr/local/lib/python3.7/dist-packages (23                                                                                                             .1.2)
jeedom@jeedom:~ $ python3 /var/www/html/plugins/script/data/spa intex_spa_get_in                                                                                                             fo.PY
/usr/bin/python3: can't find '__main__' module in '/var/www/html/plugins/script/                                                                                                             data/spa'
jeedom@jeedom:~ $ pip config set global.disable-pip-version-check true
Writing to /home/jeedom/.config/pip/pip.conf
jeedom@jeedom:~ $ python3 -m pip install -U intex-spa
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: intex-spa in ./.local/lib/python3.7/site-packages (0.8.3)
Requirement already satisfied: asyncio in ./.local/lib/python3.7/site-packages (from intex-spa) (3.4.3)
jeedom@jeedom:~ $ python3 /var/www/html/plugins/script/data/spa intex_spa_get_info.PY
/usr/bin/python3: can't find '__main__' module in '/var/www/html/plugins/script/data/spa'
jeedom@jeedom:~ $ python3 /var/www/html/plugins/script/data/spa intex_spa_get_status.PY
/usr/bin/python3: can't find '__main__' module in '/var/www/html/plugins/script/data/spa'

Lors de la première mise à jour de pip, avant reboot, il a désinstallé puis réinstallé, ce qui explique que je n’ai plus les erreurs d’avant.
Mais je ne sais pas ce qu’est ce ‹ main › module …

D’avance merci de ton aide :face_holding_back_tears: