Skip to content

Commit 4327bb9

Browse files
kaleofrCommit-La-Grenouille
authored andcommitted
KALEOFR: implementing nabrfid2server
1 parent 4012a0d commit 4327bb9

File tree

14 files changed

+350
-2
lines changed

14 files changed

+350
-2
lines changed

nabd/rfid.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class TagFlags(IntFlag):
3535

3636

3737
class Rfid(object, metaclass=abc.ABCMeta):
38-
"""Interface for rfid reader"""
38+
""" Interface for rfid reader """
3939

4040
@abc.abstractmethod
4141
def on_detect(

nabrfid2server/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
NABAZTAG_SERVICE_PRIORITY = 11

nabrfid2server/apps.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.apps import AppConfig
2+
3+
4+
class Nabrfid2serverConfig(AppConfig):
5+
name = "nabrfid2server"
1.89 KB
Binary file not shown.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# SOME DESCRIPTIVE TITLE.
2+
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3+
# This file is distributed under the same license as the PACKAGE package.
4+
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5+
#
6+
#, fuzzy
7+
msgid ""
8+
msgstr ""
9+
"Project-Id-Version: PACKAGE VERSION\n"
10+
"Report-Msgid-Bugs-To: \n"
11+
"POT-Creation-Date: 2020-02-12 14:21+0100\n"
12+
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14+
"Language-Team: LANGUAGE <[email protected]>\n"
15+
"Language: \n"
16+
"MIME-Version: 1.0\n"
17+
"Content-Type: text/plain; charset=UTF-8\n"
18+
"Content-Transfer-Encoding: 8bit\n"
19+
20+
#: templates/nabrfid2server/settings.html:38
21+
msgid "RFID to Server"
22+
msgstr "RFID vers Serveur"
23+
24+
#: templates/nabrfid2server/settings.html:38
25+
msgid "Tags can be transmitted to a remote server by URL."
26+
msgstr "Les Tags peuvent être envoyés à un serveur distant par URL."
27+
28+
#: templates/nabrfid2server/settings.html:39
29+
msgid "Setup below the transmission mode that suits for you"
30+
msgstr "Sélectionnez ci-dessous votre mode de transmission préféré"
31+
32+
#: templates/nabrfid2server/settings.html:40
33+
msgid ""
34+
"Setup also the url of your server. You can include, where you need in"
35+
" your url the following tags:<br>#RFID_TAG# : uid of the tag"
36+
"<br>#RFID_STATE# : state of the tag (detected, removed)"
37+
"<br>#RFID_FLAGS# : supported, formatted,etc."
38+
"<br>#RFID_APP# : App called by a formatted tag"
39+
"<br>#RFID_PACK# : the whole RFID packet received"
40+
"<br>#RFID_JEEPACK# : compatible RFID_PACK for Jeedom"
41+
msgstr ""
42+
"Configurez l'URL de votre serveur. Vous pouvez ajouter, où nécessaire "
43+
" dans votre url les tags suivants:<br>#RFID_TAG# : uid du tag RFID"
44+
"<br>#RFID_STATE# : état du tag (detected, removed)"
45+
"<br>#RFID_FLAGS# : supported, formatted,etc."
46+
"<br>#RFID_APP# : Application appelée par un tag programmé"
47+
"<br>#RFID_PACK# : le paquet RFID reçu, au complet"
48+
"<br>#RFID_JEEPACK# : le paquet RFID_PACK compatible avec Jeedom"
49+
50+
#: templates/nabrfid2server/settings.html:10
51+
msgid "URL Send Option"
52+
msgstr "Option d'envoie des Tags"
53+
54+
#: templates/nabrfid2server/settings.html:13
55+
msgid "Never send the tag"
56+
msgstr "Ne jamais transmettre de Tag"
57+
58+
#: templates/nabrfid2server/settings.html:14
59+
msgid "Only for unknown tag"
60+
msgstr "Seulement les tags inconnus"
61+
62+
#: templates/nabrfid2server/settings.html:15
63+
msgid "Always send the tag"
64+
msgstr "Transmettre tous les tags"
65+
66+
#: templates/nabrfid2server/settings.html:15
67+
msgid "URL of your server:"
68+
msgstr "URL de votre serveur:"
69+
70+
#: templates/nabrfid2server/settings.html:22
71+
msgid "Test me now!"
72+
msgstr "Envoyer une url test"
73+
74+
#: templates/nabrfid2server/settings.html:29
75+
msgid "Save"
76+
msgstr "Enregistrer"
77+
78+
#: templates/nabrfid2server/settings.html:30
79+
msgid "Reset"
80+
msgstr "Annuler"
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 3.0.3 on 2020-02-27 10:44
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
initial = True
9+
10+
dependencies = [
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='Config',
16+
fields=[
17+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18+
('rfid_2_server_test', models.BooleanField(default=False)),
19+
('rfid_2_server_mode', models.IntegerField(default=2)),
20+
('rfid_2_server_url', models.TextField(default='Ex: https://MY_SERVER/core/api/jeeApi.php?apikey=MY_API_KEY&type=scenario&id=MY_SCENARIO_ID&action=start&tags=rfid=&#34;#RFID_TAG#&#34;%20etat=&#34;#RFID_STATE#&#34;%20flags=#34;#RFID_FLAGS##34;%20app=#34;#RFID_APP##34;')),
21+
],
22+
),
23+
]

nabrfid2server/migrations/__init__.py

Whitespace-only changes.

nabrfid2server/models.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from django.db import models
2+
from nabcommon import singleton_model
3+
4+
5+
class Config(singleton_model.SingletonModel):
6+
rfid_2_server_test = models.BooleanField(default=False)
7+
rfid_2_server_mode = models.IntegerField(default=2)
8+
rfid_2_server_url = models.TextField(default="Ex: https://MY_SERVER/core/api/jeeApi.php?apikey=MY_API_KEY&type=scenario&id=MY_SCENARIO_ID&action=start&tags=rfid=&#34;#RFID_TAG#&#34;%20etat=&#34;#RFID_STATE#&#34;%20flags=#34;#RFID_FLAGS##34;%20app=#34;#RFID_APP##34;")
9+
10+
class Meta:
11+
app_label = "nabrfid2server"

nabrfid2server/nabrfid2server.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import sys
2+
import json
3+
import logging
4+
import requests
5+
from nabcommon.nabservice import NabService
6+
7+
8+
class NabRfid2server(NabService):
9+
DAEMON_PIDFILE = "/run/nabrfid2server.pid"
10+
11+
def __init__(self):
12+
super().__init__()
13+
from . import models
14+
15+
self.config = models.Config.load()
16+
17+
async def reload_config(self):
18+
from . import models
19+
self.config = await models.Config.load_async()
20+
21+
#logging.info("reload config: mode=" + str(self.config.rfid_2_server_mode) + " test="+str(self.config.rfid_2_server_test) + " url="+self.config.rfid_2_server_url)
22+
if self.config.rfid_2_server_test : self.send_rfid_2_url("rfid_uid_test","event_test","app_test","support_test","packet_test")
23+
24+
async def process_nabd_packet(self, packet):
25+
if ( self.config.rfid_2_server_mode==0 or (packet["type"] != "rfid_event") ): return # Never send url
26+
27+
if "app" not in packet: app = "none"
28+
else: app = packet["app"]
29+
if "support" not in packet: supp = "support unknown"
30+
else: supp = packet["support"]
31+
if "event" not in packet: _event = "no event"
32+
else: _event = packet["event"]
33+
34+
if (self.config.rfid_2_server_mode==1) and (supp=="formatted") and (app=="none") : return # Send only unknown tags
35+
self.send_rfid_2_url(packet["uid"],_event,app,supp,packet)
36+
37+
def send_rfid_2_url(self, uid,_event,app,supp,packet):
38+
#logging.info("send rfid 2 url: mode=" + str(self.config.rfid_2_server_mode) + " test="+str(self.config.rfid_2_server_test) + " url="+self.config.rfid_2_server_url)
39+
url_message = self.config.rfid_2_server_url.replace("#RFID_TAG#",uid)
40+
url_message = url_message.replace("#RFID_APP#",app)
41+
url_message = url_message.replace("#RFID_FLAGS#",supp)
42+
url_message = url_message.replace("#RFID_STATE#",_event)
43+
str_pack = json.dumps(packet);
44+
url_message = url_message.replace("#RFID_PACK#",str_pack)
45+
str_pack = str_pack.lower()
46+
str_pack = str_pack.replace('\"','')
47+
url_message = url_message.replace("#RFID_JEEPACK#",str_pack)
48+
f = requests.get(url_message)
49+
50+
async def client_loop(self):
51+
try:
52+
idle_packet = '{"type":"mode","mode":"idle","events":["rfid/*"]}\r\n'
53+
self.writer.write(idle_packet.encode())
54+
while self.running and not self.reader.at_eof():
55+
line = await self.reader.readline()
56+
if line != b"" and line != b"\r\n":
57+
try:
58+
packet = json.loads(line.decode("utf8"))
59+
logging.debug(f"process nabd packet: {packet}")
60+
await self.process_nabd_packet(packet)
61+
except json.decoder.JSONDecodeError as e:
62+
logging.error(
63+
f"Invalid JSON packet from nabd: {line}\n{e}"
64+
)
65+
self.writer.close()
66+
await self.writer.wait_closed()
67+
except KeyboardInterrupt:
68+
pass
69+
finally:
70+
if self.running:
71+
self.loop.stop()
72+
73+
if __name__ == "__main__":
74+
NabRfid2server.main(sys.argv[1:])
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[Unit]
2+
Description=Nabaztag Rfid to URL sender daemon
3+
After=nabd.service
4+
StartLimitIntervalSec=0
5+
6+
[Service]
7+
Type=simple
8+
Restart=always
9+
RestartSec=1
10+
User=root
11+
WorkingDirectory=/home/pi/pynab
12+
ExecStart=/home/pi/pynab/venv/bin/python -m nabrfid2server.nabrfid2server
13+
PIDFile=/run/nabrfid2server.pid
14+
15+
[Install]
16+
WantedBy=multi-user.target

0 commit comments

Comments
 (0)