[Python] Protocol SIA des alarmes

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
supeve
Messages : 85
Inscription : 21 oct. 2020, 18:41

[Python] Protocol SIA des alarmes

Message par supeve »

Bonjour,

Je ne sais pas si je suis au bonne endroit.
J'ouvre se fil pour échanger sur le protocol SIA qui permet aux alarmes de communiquer avec les centres de surveillance.

Ca peut etre sympa de récupérer des infos dans domoticz.
Perso, mon but serrai très simple connaitre l'activation/désactivation de l'alarme pour ralentir la VMC, éteindre les lumières, ou simulation de présence.
Bien sur ca peut ce faire par un relais ou autre sur les GPIO, mais si on peut récupérer l'info directement sur le reseau local c'est mieux je pense.

Apparemment, c'est techniquement possible, du travail à été fait sur jeedom et home assistant.
https://community.jeedom.com/t/plugin-p ... rmes/11537
https://community.jeedom.com/t/plugin-t ... test/26499
https://www.home-assistant.io/integrations/sia/

Et sur domoticz aussi, du travail à été fait :
https://github.com/andyboeh/domoticz-jablotron
https://github.com/eavanvalkenburg/pysiaalarm

Quelqu'un à testé ? Un retour d’expérience ?


Voila le sujet est ouvert, j'en ai pas trouvé d'autre similaire, si je ne suis pas au bon endroit, vous pouvez le déplacer.

Pour mieux comprendre :
https://support.ajax.systems/fr/how-to- ... onnection/
Apparemment ce genre d'alarme peut envoyer une requête vers une adresse IP ( je suppose que ca peut être celle de domoticz sur le réseau local).

Liste des code pour le SIA-DC09 :
https://docs.google.com/spreadsheets/d/ ... 1957751676

L'idée ca serai d'avoir un dummy qui prend la valoir du code reçu, et après on en fait ce qu'on veut.
Enfin c'est peut-être pas si simple.
Dernière modification par supeve le 04 oct. 2022, 19:28, modifié 2 fois.
oeildefeu
Messages : 31
Inscription : 18 févr. 2022, 19:28

Re: Protocol SIA des alarmes

Message par oeildefeu »

Salut,
je me suis codé un petit script pour faire ça pour mon alarme AJAX:
il nécessite python3.9 (sinon il faudra changer le env), python3-systemd, pysiaalarm et je sais pu quoi

Code : Tout sélectionner

sudo apt-get update
sudo apt install python3-pip python3-systemd python3-requests
pip3 install pysiaalarm 
Le script:

Code : Tout sélectionner

#! /usr/bin/env python3.9
import json
import requests
#import logging
import time

from pysiaalarm import SIAAccount, SIAClient, SIAEvent
import systemd.daemon

#logging.basicConfig(level=logging.DEBUG)

local_ip = "192.168.0.1"
sia_port = 8125
sia_account = "AAAA"
url_domoticz = "http://192.168.0.1:80/"
id_armed_night = "11" #night mode alarm switch id
id_armed_normal = "21" #alarm switch id
id_text = "35" #text device to recover non recognized code

reactions = {
	"BA" : [{"state":"ALARM","value":True}],
	"BS" : [{"state":"ALARM","value":True}],#device shorted
	"BV" : [{"state":"ALARM","value":True}],#intrusion
	"HA" : [{"state":"ALARM","value":True}],#hold-up
	"JA" : [{"state":"ALARM","value":True}],#Unauthorized access keypad
	"PA" : [{"state":"ALARM","value":True}],
	"SM" : [{"state":"ALARM","value":True}], #Alarm because of movement
	"YC" : [{"state":"ALARM","value":True}],#hub offline mobile and ethernet
	"NL" : [{"state":"ARM NIGHT" ,"value":True}],
	"NC" : [{"state":"ARM NIGHT" ,"value":True}],
	"OP" : [{"state":"ARM","value":False}],
	"CF" : [{"state":"ARM","value":True}], #armed with malfunction
	"CL" : [{"state":"ARM","value":True}],
	"OA" : [{"state":"ARM","value":False}],
	"FA":  [{"state":"FIRE" ,"value":True}],
	"KA":  [{"state":"FIRE" ,"value":True}],#temperature of fire sensor
	"WA":  [{"state":"LEAK","value":True}],
	"WH":  [{"state":"LEAK" ,"value":False}],
	"GA":  [{"state":"GAS","value":True}],
	"GH":  [{"state":"GAS" ,"value":False}],
	"BR" : [{"state":"ALARM","value":False}],
	"TA" : [{"state":"LID OPEN","value":True}],
	"TR" : [{"state":"LID OPEN","value":False}],
	"ZZ" : [{"state":"Device OFF","value":True}],
	"ZY" : [{"state":"Device OFF","value":False}],
	"YP" : [{"state":"Power failure","value":True}],
	"YQ" : [{"state":"Power failure","value":False}],
	"RB" : [{"state":"Updating firmware","value":True}],
	"RS" : [{"state":"Updating firmware","value":False}],
	"RP" : [],
	"YG" : [] #New settings
	}

def func(event: SIAEvent):
	#print(event.code)
	tipo = event.code
	if tipo in reactions:
		reaction = reactions[tipo]
		for reactio in reaction:
			state = reactio["state"]
			value = reactio["value"]
			print("Event: " + state + " : " + str(value))
			if state == "ARM" and value == False:
				r = requests.get(url_domoticz + 'json.htm?type=command&param=switchlight&idx=' + id_armed_normal + '&switchcmd=Off')
				r = requests.get(url_domoticz + 'json.htm?type=command&param=switchlight&idx=' + id_armed_night + '&switchcmd=Off')
			elif state == "ARM" and value == True:
				r = requests.get(url_domoticz + 'json.htm?type=command&param=switchlight&idx=' + id_armed_normal + '&switchcmd=On')
			elif state == "ARM NIGHT" and value == True:
				r = requests.get(url_domoticz + 'json.htm?type=command&param=switchlight&idx=' + id_armed_night + '&switchcmd=On')
	else:
		print("Unknown event: " + tipo )
		r = requests.get(url_domoticz + 'json.htm?type=command&param=udevice&idx=' + id_text + '&nvalue=0&svalue='+tipo)


account = [SIAAccount(sia_account, "")]
sleep_time = 1200
count = 0
#systemd.daemon.notify('READY=1')
with SIAClient(local_ip, sia_port, account, function=func) as client:
	#time.sleep(sleep_time)
	client.start()
	systemd.daemon.notify('WATCHDOG=1')
	while (True) :
		time.sleep(1)
		count = count + 1
		if count == 30:
			count = 0
			systemd.daemon.notify('WATCHDOG=1')

Dernière modification par oeildefeu le 04 avr. 2024, 22:16, modifié 1 fois.
jcligny
Messages : 5
Inscription : 18 mars 2017, 21:27

Re: Protocol SIA des alarmes

Message par jcligny »

Bonjour oeildefeu.

Merci pour votre script il fonctionne très bien avec mon alarme Ajax.

Une question svp comment utilisez-vous le script en tant que service ?

J'ai essayé via systemctl sans succès.

Merci d'avance.

Jérôme
Dernière modification par Keros le 15 août 2022, 07:59, modifié 1 fois.
Raison : Citation supprimée. Merci de ne pas citer le message précédent lors d'une réponse directe.
oeildefeu
Messages : 31
Inscription : 18 févr. 2022, 19:28

Re: Protocol SIA des alarmes

Message par oeildefeu »

Bonjour,
j'ai créé un /etc/systemd/system/SIA_Server.service

Pensez à changer le chemin si ce n'est pas /home/pi/SIA_Server.py

Code : Tout sélectionner

[Unit]
Description=SIA Server Service

[Service]
Type=simple
ExecStart=/home/pi/SIA_Server.py
Restart=on-failure
RestartSec=10
#WatchdogSec=60

[Install]
WantedBy=multi-user.target

Puis je l'ai activé :

Code : Tout sélectionner

systemctl enable SIA_Server.service
Dernière modification par oeildefeu le 20 déc. 2024, 09:41, modifié 2 fois.
supeve
Messages : 85
Inscription : 21 oct. 2020, 18:41

Re: Protocol SIA des alarmes

Message par supeve »

Bonjour,
Voila qui est intéressant.

L'un de vous deux peut-il me guider sur la marche à suivre?

Je ne demande pas un tuto, mais globalement l'ordre des étapes.

J'ai beau regarder sur le github de https://github.com/eavanvalkenburg/pysiaalarm mais je n'y comprend pas grand chose.

En fait je n'ai jamais fait de python ... juste un peut de C++ et de lua.


Pour résumer, si je peux avoir les grandes étapes, ça va déjà pas mal m'aider.

Merci.
oeildefeu
Messages : 31
Inscription : 18 févr. 2022, 19:28

Re: Protocol SIA des alarmes

Message par oeildefeu »

Tu as bien python d'installé ? Si oui, quelle version ?
Ensuite faut installer les dépendances ==> apt install python3-systemd python3-requests

puis la lib pysiaalarm ==> pip3 install pysiaalarm

Puis créer un fichier avec le code que j'ai mis, changer les paramètres dedans: IP du serveur où le fichier tournera, IP de domoticz etc..

Pis le lancer.
supeve
Messages : 85
Inscription : 21 oct. 2020, 18:41

Re: Protocol SIA des alarmes

Message par supeve »

MERCI.

Je crois que je commence à comprendre.

Déjà, j'ai l'impression que le Python est presque un système à par entière, ca, je ne le savais pas.

Ton script utilise la "bibliothèque" "pysiaalarm", mais "pysiaalarm" tout seul ne fait rien.
En fait c'est un peu comme sur l'IDE d'arduino.

Globalement j'arriverais presque à comprendre ton code !


Petite question :
1-sia_port = 8125 _ Je le trouve dans l'appli ajax ? Pas de "guillemets"
2-sia_account = "AAAA" _ C'est le nom de l'entreprise de surveillance simulé? Je mets ce que je veux, idem sur l'appli ajax.
3- Pas besoin de l'IP de la box ajax ?
4-Tu n’utilises pas de clé de cryptage? En réseau local c'est peut-être inutile.
4-Je ne comprends pas la fin du code

Code : Tout sélectionner

account = [SIAAccount(sia_account, "")]
sleep_time = 1200
count = 0
#systemd.daemon.notify('READY=1')
with SIAClient(local_ip, sia_port, account, function=func) as client:
  #time.sleep(sleep_time)
  client.start()
  systemd.daemon.notify('WATCHDOG=1')
  while (True) :
    time.sleep(1)
    count = count + 1
    if count == 30:
      count = 0
      systemd.daemon.notify('WATCHDOG=1')
En tout cas, encore MERCI, si ca marche, ca ouvre plein de possibilité.
oeildefeu
Messages : 31
Inscription : 18 févr. 2022, 19:28

Re: Protocol SIA des alarmes

Message par oeildefeu »

Python est un interpréteur: tu écris ton script et pour exécuter ton script, tu ne le compiles pas, tu dis à python de l'interpréter et de l'exécuter avec la première ligne.
D'ailleurs j'ai oublier mais il faudra un "chmod +x" à ton script pour qu'il s'exécute.

Oui dans python il y a tout un tas de librairie qui permettent de ne pas réinventer la roue, pysiaalarm en fait partie.

Petites réponses :) :
1. pas de guillemet non, c'est un chiffre. Tu dois mettre le même ici et dans l'appli Ajax
2. c'est le nom du compte.. je ne sais pas trop si c'est vraiment lié au nom de l'entreprise qui surveillerait l'installation. . Tu dois mettre le même ici et dans l'appli Ajax
3. Non pas besoin, c'est le Hub qui se connecte au serveur SIA et pas l'inverse
4. Non, pas testé avec d'ailleurs, comme tu dis, sur réseau local, je ne vois pas d'intérêt.. mais j'ai peut être tord :) faudrait essayer avec... ça changerait un peu le code..
5. la fin du code sert à lancer le serveur SIA dans une boucle infinie et à renseigner systemd sur le fait que le serveur tourne bien, sinon systemd le relance toutes les minutes :)

Et de rien ! :) normalement ça marche ! là je n'ai codé que la reconnaissance des mise en route de l'alarme mais on peut récupérer et traiter tous les codes que l'alarme génère.
supeve
Messages : 85
Inscription : 21 oct. 2020, 18:41

Re: Protocol SIA des alarmes

Message par supeve »

oeildefeu a écrit : 16 août 2022, 20:44 Tu as bien python d'installé ? Si oui, quelle version ?
Oui, python est installé.
Mais j'ai un truc bizzard :
Dans le terminal, python -V me donne Python 2.7.16
Dans domoticz / A Propos, j'ai Python Version: 3.7.3

Du coup je ne sais pas trop.

Mon domoticz est en 2022.1
oeildefeu
Messages : 31
Inscription : 18 févr. 2022, 19:28

Re: Protocol SIA des alarmes

Message par oeildefeu »

tu as probablement plusieurs versions de Python d'installées. C'est pas grave !
Pou vérifier tu tapes "python" puis touche "TAB" pour afficher toutes les commandes qui commencent par python et tu verras les python installés.

Pour le script, tu peux changer ensuite par la version 3 que tu as "python3.7" par exemple
Répondre