From 2df518f0b4374c0caa1bd0755f142ca2c2c35043 Mon Sep 17 00:00:00 2001
From: Elisa <20030784@studenti.uniupo.it>
Date: Sun, 24 Jul 2022 19:55:17 +0200
Subject: [PATCH] aggiunto messaggi da inviare alla web app

---
 antifurto/bin/bin/install.bash                |   2 +
 antifurto/bin/bin/start.bash                  |   6 +
 antifurto/bin/bin/stop.bash                   |   5 +
 antifurto/bin/bridge.conf                     |  15 ++
 antifurto/bin/code/Antifurto.class            | Bin 0 -> 5382 bytes
 antifurto/bin/code/Automa.class               | Bin 0 -> 4016 bytes
 antifurto/bin/code/Esecutore.class            | Bin 0 -> 4046 bytes
 antifurto/bin/code/Helper.class               | Bin 0 -> 1106 bytes
 antifurto/bin/code/MyQueue.class              | Bin 0 -> 1160 bytes
 antifurto/bin/code/Pair.class                 | Bin 0 -> 1043 bytes
 antifurto/bin/code/Publisher.class            | Bin 0 -> 1051 bytes
 antifurto/bin/code/SubscribeCallback.class    | Bin 0 -> 7464 bytes
 antifurto/bin/code/Timer.class                | Bin 0 -> 856 bytes
 antifurto/bin/conf.xml                        |  12 ++
 antifurto/bin/logger.xml                      |  10 +
 antifurto/bin/templates/interruttore.xml      |   6 +
 antifurto/bin/templates/sensoremovimento1.xml |   6 +
 antifurto/bin/threads/MqttClientThread.xml    |  11 ++
 antifurto/res/CONF/deltaSensoriMovimento.json |   6 +-
 antifurto/res/CONF/zona.json                  |  10 +-
 antifurto/res/stato.json                      |   2 +-
 antifurto/src/code/Antifurto.java             |  72 +++++---
 antifurto/src/code/Automa.java                |  32 ++--
 antifurto/src/code/Esecutore.java             |  54 +++++-
 antifurto/src/code/Helper.java                | 174 +++++++++---------
 antifurto/src/code/Pair.java                  |  12 +-
 antifurto/src/code/Publisher.java             |   4 +-
 antifurto/src/code/SubscribeCallback.java     | 158 ++++++++++++----
 28 files changed, 414 insertions(+), 183 deletions(-)
 create mode 100755 antifurto/bin/bin/install.bash
 create mode 100755 antifurto/bin/bin/start.bash
 create mode 100755 antifurto/bin/bin/stop.bash
 create mode 100644 antifurto/bin/bridge.conf
 create mode 100644 antifurto/bin/code/Antifurto.class
 create mode 100644 antifurto/bin/code/Automa.class
 create mode 100644 antifurto/bin/code/Esecutore.class
 create mode 100644 antifurto/bin/code/Helper.class
 create mode 100644 antifurto/bin/code/MyQueue.class
 create mode 100644 antifurto/bin/code/Pair.class
 create mode 100644 antifurto/bin/code/Publisher.class
 create mode 100644 antifurto/bin/code/SubscribeCallback.class
 create mode 100644 antifurto/bin/code/Timer.class
 create mode 100644 antifurto/bin/conf.xml
 create mode 100644 antifurto/bin/logger.xml
 create mode 100644 antifurto/bin/templates/interruttore.xml
 create mode 100644 antifurto/bin/templates/sensoremovimento1.xml
 create mode 100644 antifurto/bin/threads/MqttClientThread.xml

diff --git a/antifurto/bin/bin/install.bash b/antifurto/bin/bin/install.bash
new file mode 100755
index 0000000..5b474c2
--- /dev/null
+++ b/antifurto/bin/bin/install.bash
@@ -0,0 +1,2 @@
+#!/bin/bash
+if [ ! -d "/home/debian/hat_home" ]; then mkdir /home/debian/hat_home; fi
diff --git a/antifurto/bin/bin/start.bash b/antifurto/bin/bin/start.bash
new file mode 100755
index 0000000..1396363
--- /dev/null
+++ b/antifurto/bin/bin/start.bash
@@ -0,0 +1,6 @@
+#!/bin/bash
+status="OFF"
+running=$(/usr/bin/pgrep antifurto)
+if [ -f "/home/debian/CONFIG/antifurto/STATUS" ]; then status=$(cat /home/debian/CONFIG/antifurto/STATUS); fi
+if [ ! -z "$running" ]; then status="OFF"; fi
+if [ $status == "ON" ]; then (/home/debian/CONFIG/antifurto/bin/antifurto /home/debian/CONFIG/antifurto &>/dev/null&); fi 
diff --git a/antifurto/bin/bin/stop.bash b/antifurto/bin/bin/stop.bash
new file mode 100755
index 0000000..c7fc461
--- /dev/null
+++ b/antifurto/bin/bin/stop.bash
@@ -0,0 +1,5 @@
+#!/bin/bash
+status="NONE"
+if [ -f "/home/debian/CONFIG/antifurto/STATUS" ]; then status=$(cat /home/debian/CONFIG/antifurto/STATUS); fi
+if [ $status == "OFF" ]; then /home/debian/bin/stopag antifurto; fi
+
diff --git a/antifurto/bin/bridge.conf b/antifurto/bin/bridge.conf
new file mode 100644
index 0000000..cf74ca9
--- /dev/null
+++ b/antifurto/bin/bridge.conf
@@ -0,0 +1,15 @@
+connection bridge-pissir-20030784
+address luci.local:1883
+bridge_cafile /etc/mosquitto/ca_certificates/ca_certificate.pem
+
+tls_version tlsv1.2
+try_private false
+remote_username gruppo2
+remote_password funziona
+
+topic to/all in 2
+topic rpc/gruppo2/luci/antifurto in 2
+topic from/gruppo2/luci/gpio/+ both 2
+
+topic from/gruppo2/luci/antifurto/description out 1
+topic from/gruppo2/luci/antifurto out 1
diff --git a/antifurto/bin/code/Antifurto.class b/antifurto/bin/code/Antifurto.class
new file mode 100644
index 0000000000000000000000000000000000000000..8ceee73a134bc01304f619ec008df9f73513046f
GIT binary patch
literal 5382
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

literal 0
HcmV?d00001

diff --git a/antifurto/bin/code/Automa.class b/antifurto/bin/code/Automa.class
new file mode 100644
index 0000000000000000000000000000000000000000..e7c5c2575f330bc66376541054a0212bd2ae441d
GIT binary patch
literal 4016
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

literal 0
HcmV?d00001

diff --git a/antifurto/bin/code/Esecutore.class b/antifurto/bin/code/Esecutore.class
new file mode 100644
index 0000000000000000000000000000000000000000..e5c632a21e44d6bef8a89c8062d1b7beae587149
GIT binary patch
literal 4046
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

literal 0
HcmV?d00001

diff --git a/antifurto/bin/code/Helper.class b/antifurto/bin/code/Helper.class
new file mode 100644
index 0000000000000000000000000000000000000000..cbfca13d4240a1884a93c6cbb7ccbb591b612e09
GIT binary patch
literal 1106
zcmZuwT~pIQ6g}HEYze_a3oZ2n@eAA1Hhv%~1r!iRofc-SqtnNbE}dXaI%$gj8y|hu
zmv+X^_~?Uw!~Y@PO<F-{lD*m7yZ79)=Wc%e`ThgIGImtVVv*xEM@B^$SrsAVR4gGc
zX9a1BQRp0ZRH(>u+*P6Bo;3G4mQ}>CD9r<DC`Ut)V};`(!`PZ-TiymkIFo(L5ZQL>
zf+1G6Y_Z$<urJ&<#(tALYTI<JBkQ>(KXRF}<2LlewqxtBs(ZV8`-j5xO65c2$k3aH
z-O#I^YuSyGgj9DvnWE)cj@{;X#4z3zjm7|IF*73Pyo+J7>KW$yiqZ1va6G2H(l!ab
z>U3OF1iU6*h-OQ;Mae@$5-EnH&&hK1t<J%La7F!{Yk9(Dhz|oYHE_z5RcT5bYZ}(E
zq2Y=2Je5c|lk-{_bqRE?LJ*KRn;N!2+NRD5v(>Shl&oPJ&lo055?v3tGfbT<4s>Nm
z47tAC`zPjq3j?_sW=H8sJxC1vq(iV(zcYyuO=O6A&Jb=UlO5Fz<)hS)K{1<7o8G6;
zgT4FcQI`ag=ZFrO(P|01&QKV|?_7z2Iwf4g44r&=g-LztC)qjrx<YSi2$Wn8>>EuO
z(qzYcr-m#p;u8H6a_J@%N~V-PLbX1^wWS^+Jt&oYu8XlQc)pA12}B$bS{%a^-E)}6
zWyEQKyo{=5F^{VQ;LilBP-HzmUg<-v5tWJEKD1h)hso7QI?~03TKOl^eZ*=#Oi`Wb
zB^q7CD_@R(%XlLHl>kCM_jz!dCkZq~zvmpy(paE<tWfz9m0qA|9-(6jD4c|$!Ev4A
V25?NAq;L2H-cz(0Zu)g@{RJL2@pb?J

literal 0
HcmV?d00001

diff --git a/antifurto/bin/code/MyQueue.class b/antifurto/bin/code/MyQueue.class
new file mode 100644
index 0000000000000000000000000000000000000000..50ac71d1e9f4ea9afa31bd320196bcda41a7245b
GIT binary patch
literal 1160
zcmZ`&*-{fx5IvJ^vP=@fs;CHpItfZpaU(H`2vt-Cmr6=Y--hH$T}&o%GK1z*`~qHl
zP)kFVR`~(`i67vrdTx>eS$w(O)A#i0?$dXE{QmkKzyemINWs*Rj=~2sf&pZdH>-|I
z>h5xsF@B~nrz0D|Jg$UsHHvFkP?+oLxS`{wj$0anuRY-j4I{-ZYun0tuB>I39LH)G
zWy{TJh?L}}ZMmL9%=mGbe7T$}5E#l!Te<}eelz`4Ltwd4WlFLrZSl~nZwRMsZPXai
zWoxD0blY9v3j$lhuCl(_Bd=NZX7<s>mZ-Qn#S=2guN>VG6(P6DFl?reVl~7|u2p%p
zZZ*4wI5~$i)6C`&j;J@b#Zs-N!OWKzkER!nhBQP=4bQ2FRjK+m*4s~%RC7uv1EUzz
zFm#M&1_m)?U>v6m+{U7T9L5af6?~!#?@qX8yTWn2rYou|Z!4nd%7(4uj)4O1QjCAD
zC&m8#Jp)U)Z(tb@46G<hqe7Xp{nj)L>{sY%NR_SX|Kz3m5xe2am+h`Hfj5?P4{(&)
zEmzdZ(eQZDe<HGxee6ivExC@c>QuL<!oe{2)l{IGeQ34JlJ;hAwY{w<z}m4J4OVKx
zaxlf`oZ{2h_-?5!?J&Q57(tLe7s2xcBlGan0|qj?&@$iPd%g?*7X&_bb5HV25CMb{
zKm<udiRPO6*^{&?JDmB9KnKD1ds(4wJkCB&;|%MnT645M+Jr*Sb`W}&=|DeRDaAU2
zh_mNj#}ni@i^)ER>~l;rHT({vG?AS@zlxs_8#FqI@BI0x*!>+OKClHHF%F=9UNy=D
zzro>kwiDwJ2}Y9~XN>+h+nnNUnB%VNI2Y@epJsGsPp+AR11I;JS2aK^Q|a|uKaUHH
H`Ec<seKzU}

literal 0
HcmV?d00001

diff --git a/antifurto/bin/code/Pair.class b/antifurto/bin/code/Pair.class
new file mode 100644
index 0000000000000000000000000000000000000000..2470277b8b66da852c3f09e4877b4624b7c51b5b
GIT binary patch
literal 1043
zcmaJ<e^1j;6g_X<=vLksbbwAp9f*t;sRI6l_>Vyi89$N{jenNfEJfBXT`~Ht(8x$M
z@dNmwjOVooB50c4`+9rcJ?EbHe*FCU9l#P+3=CtcgbHq{Fs<XZfjp*)7*Tnqh-wK9
z%o?y@8$`^h@*N%X2Fh@B+|_YUppZn}z!NZ=yY73}*>l6T(@NqXY%dFFonBjDU?m8H
z<f*_+<2>kmW%iXo{#o?a7pOFY(BIha?D+AvyR*kivF#_@8RKYU_WWkD5wWglWfHCR
zqHuF(*Y^^EON2*p+u3E!S!-=>WIw3VSpDGn-6V*@9tn~tlP^$iC9d~w-R-8_9GuWr
zv>$u^^FV1SZMi`_uf~=b#e&2LOo=K?f$9ZJ5{p>UabMyA9_n}`@fc4euHu@+b<_mL
z&ulsoC9#YJvU#+`QIrD1r(XXaPirXOwC+AfUH-q%$AkaNjz5~WKK2s7!?uxXJC@lU
zM9vn^H=#|w+o6BeRL$A4fZkQ0y^#AZkfX#_QbcO<cI<jS>bzycyqq~c^fF!1PUZpx
zEgoYW=hq_tYs?kv2*R=tk+bFwp?zYB=gesGrUHYE5+&Z&AwB|^Q9Euh!7PX<SYMDk
zIN3Ik7DpJbTnN?vhAKfkKgv<EHYh5`Y<)xi%@GPs+Z<2?edw=kv&f~UmY-3|mWF-W
zFH>AYk<?Z8Y_RJDd*#Vc=F1Dhs90VwE0&7Y$6z1wplSCpBo0^xbT%mS_o)eWRwik}
V6zkKtK@6vSspBT`b$;bA`3nHG&D;P0

literal 0
HcmV?d00001

diff --git a/antifurto/bin/code/Publisher.class b/antifurto/bin/code/Publisher.class
new file mode 100644
index 0000000000000000000000000000000000000000..4d607d806d239c2b6883e4b242d430e7d963e18a
GIT binary patch
literal 1051
zcmZuwTTc@~7(LTgmX@XEj!=uDBBd>?3f?F}4AG|+F>OqIoG#;bu<WkeS)#v)XA>!j
zCdOxfgg?Xw@tbWCie|Il%y&C;=FH5G-(S7~Si@EdY1~d?7z^6mF|e3I0{Ik{P|&8R
z-I6xTDXhRUa5se^+%s_Bz$!z+_VzeKx<aF{svlp4A{1qYWKB9QS79I+vVF;ouD8o&
zP~N1<0lOuIs~ASQiD#~oZ^J-&I=3NRsWutr^L-fQ%cV=NiOM!nV8~RYD|W(zh6w7s
z(W1yoe{(;9{~=|#<H*o;<hFOf-93+CF<;r|hums$*Rg6UkgikyH=<d@gU}_L*Yn|;
z;`X~L_ah>aWQ!yqL#pP5fh}H0O)tG0Hd?aX6v2vK!^9+VCNdZ?F^&n6GLly7rBhi0
zYbGAxp@~O$Y~l&lO_Z^2V8g^yWEo0c;8=oG_1nVodDFAH3R?&7l{#Ftsx&<RU<+SK
z&o!}$9C7HbaYlp=<9xgIW+3<;gL(0YN$$3ADLQ#knU{@yVXLy<yAcRm$V1xSM1JXl
zRJ{_0K}V>%=S%x?MNeKjeX6LooilcSF9r$gcbQg&YI;N><I{<#NbP#SZGm~Z%xSve
zG5SbJFpNgt82KbB&EpiC#1#3{<gL;er!iAF0V@=b5i69A5&uLXhO1=9=mh}!9Sk7}
zlfZ|2kTX;<i!9kLP$H@v|BA$$V(A1|b_$;nTkc@s94sBJH9~Ns1UyEq*O2Q0gp|`v
z7Ia$&#&;wtG>sQK7^FYhLFx#D)lvuM(dkcW8lu&6WMdJ}SqxC~H2E_W*RZpgBX&1w
dHb<E$0zajA%)oU6H^2<c|02eWDzsd;{s4iZ<ca_Q

literal 0
HcmV?d00001

diff --git a/antifurto/bin/code/SubscribeCallback.class b/antifurto/bin/code/SubscribeCallback.class
new file mode 100644
index 0000000000000000000000000000000000000000..23929201c5cbee84789f64070e14972ad29b922f
GIT binary patch
literal 7464
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

literal 0
HcmV?d00001

diff --git a/antifurto/bin/code/Timer.class b/antifurto/bin/code/Timer.class
new file mode 100644
index 0000000000000000000000000000000000000000..453e7f52694373063e3dfdbee7b4c29d1ec4ba84
GIT binary patch
literal 856
zcmZuv+fEZv6kTW9GBQj7!Kz%Pcq@ZY?>CTy7)Yx1l9cqp7jtNjb+DajhBHJyz>n|?
zc-B}nKKKECf$x5WFXB1}6UF#2`*QZ$d+oF4eEs?P3xMlb@sP)ve)yO%rfAHpF=suT
z!+8%EaM3_YF6R0XVBW(eEVx*7Q5MKGRa@=~h>AcTV=W&FWYxB62n<&naZ{Don4~&R
z)Dj_*QAY~o4{NJ7HHGCc3iXP>Y^hTDx9<pcu1<pc94s(Y4I}k9?QE)KLvFTtl1b8t
zwq!v0nwE`Mk7U=@xV?Z^i_@f`)<c8!Ho}fd7PsV%^ijaLk3kIi7&hiOMtqFogp12Q
zuHdSRYd*EQ;o~N52~3-&a$82NawXC#Nz$%X&9&DJ)zx7fxw!4)4(_^G^0AD2<g!Xw
zLhACTd*fxIWK&?k)(_R-y=0`r7ips7RjtFF*xu-wz~E6m*(O`9FpXMaUAC!8sbcP(
z+iok>HR%JB{>4_?-PWqZX>qCr3RSyD7?+<WVWexCt91A)M*njx;C2nDO?3;U!$y1k
zC!1TUp_k_BDDuhV`J%FLjF5~Rqowtf(|RguJ%`{V1WqwqCoV@n9(;rdCVFs!$sRJn
zLJ!$sEZalw9jgMT4F-L*{p9dy2gqaoQXXTB1nv0mnO)9wh@1~TAh(acw+BBMW%*_H
z;nF#8KH=Ej!T0KWc=P)h*gN>f)&iz5!@-Uvn}*8~BcvL&>rRnihAS6YEis;8)g|`1
Mi%B+5F?BHg3$_rirT_o{

literal 0
HcmV?d00001

diff --git a/antifurto/bin/conf.xml b/antifurto/bin/conf.xml
new file mode 100644
index 0000000..b0ba5f7
--- /dev/null
+++ b/antifurto/bin/conf.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" ?><set type="pathnames">
+<attribute category="generic" name="agenttype" value="antifurto"/>
+<attribute category="generic" name="agentname" value="antifurto_$HOST"/>
+<attribute category="generic" name="homedir" value="/home/debian/hat_home/antifurto"/>
+<attribute category="generic" name="emergency_homedir" value="/home/debian/hat_home/antifurto"/>
+<attribute category="generic" name="description" value="Local Antifurto"/>
+<attribute category="generic" name="port" value="8090"/>
+<attribute category="generic" name="threads" value="threads"/>
+<attribute category="generic" name="mqtt_domain" value=""/>
+<attribute category="generic" name="mqtt_subdomain" value=""/>
+<attribute category="generic" name="mqtt_service" value="antifurto"/>
+</set>
diff --git a/antifurto/bin/logger.xml b/antifurto/bin/logger.xml
new file mode 100644
index 0000000..6bd6903
--- /dev/null
+++ b/antifurto/bin/logger.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" ?><set type="pathnames">
+	<attribute category="generic" name="log_theme" value="from/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/logger"/>
+	<attribute category="generic" name="status_theme" value="from/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/$LOCALNAME"/>
+	<attribute category="generic" name="notify_theme" value="from/any"/>
+	<attribute category="generic" name="describe_theme" value="from/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/description"/>
+	<attribute category="generic" name="log_msg" value="{$LOCALNAME:$MESSAGE}"/>
+	<attribute category="generic" name="status_msg" value="{status:$MESSAGE}"/>
+	<attribute category="generic" name="notify_msg" value="{$INFOTYPE:$MESSAGE}"/>
+	<attribute category="generic" name="describe_msg" value=" $MESSAGE "/>
+</set>
diff --git a/antifurto/bin/templates/interruttore.xml b/antifurto/bin/templates/interruttore.xml
new file mode 100644
index 0000000..e0f6b5a
--- /dev/null
+++ b/antifurto/bin/templates/interruttore.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<set type="interruttore">
+<attribute name="type" value="booleanin"/>
+<attribute name="name" value=""/> <!-- DA RIEMPIRE CON IL NOME SPECIFICATO DALL'UTENTE PER QUELL'INTERRUTTORE. SE NON SPECIFICATO, IL NOME SARA' LO STESSO DEL NOME LOGICO DI QUELL'INPUT -->
+<attribute name="capename" value=""/> <!-- DA RIEMPIRE CON IL NOME LOGICO DELL'INPUT -->
+</set>
diff --git a/antifurto/bin/templates/sensoremovimento1.xml b/antifurto/bin/templates/sensoremovimento1.xml
new file mode 100644
index 0000000..706315a
--- /dev/null
+++ b/antifurto/bin/templates/sensoremovimento1.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<set type="sensoremovimento">
+<attribute name="type" value="booleanin"/>
+<attribute name="name" value=""/> <!-- DA RIEMPIRE CON IL NOME SPECIFICATO DALL'UTENTE PER QUEL SENSORE. SE NON SPECIFICATO, IL NOME SARA' LO STESSO DEL NOME LOGICO DI QUELL'INPUT -->
+<attribute name="capename" value=""/> <!-- DA RIEMPIRE CON IL NOME LOGICO DELL'INPUT -->
+</set>
diff --git a/antifurto/bin/threads/MqttClientThread.xml b/antifurto/bin/threads/MqttClientThread.xml
new file mode 100644
index 0000000..f17afa1
--- /dev/null
+++ b/antifurto/bin/threads/MqttClientThread.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<set type="thread">
+<attribute category="generic" name="status" value="ON"/>
+<attribute category="generic" name="host" value="localhost"/>
+<attribute category="generic" name="port" value="1883"/>
+<attribute category="topic" name="to/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/#" value="mqtt_sub"/> <!-- Sottoscrivo i messaggi che provengono da qualsiasi mia componente, ovvero dall'interruttore on/off e dai sensori di movimento -->
+<attribute category="topic" name="from/$MQTT_DOMAIN/+/gpio/#" value="mqtt_sub"/> <!-- Sottoscrivo i messaggi che notificano il cambiamento di stato dei sensori -->
+<attribute category="topic" name="rpc/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE" value="mqtt_sub"/> <!-- Su questo topic ricevero' le richieste di inviare il mio stato attuale -->
+<attribute category="topic" name="rpc/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/#" value="mqtt_sub"/> <!-- Su questo topic ricevero' le richieste di inviare lo stato delle mie componenti, che prendero' dallo stato corrispondente del gpio -->
+<attribute category="topic" name="to/all" value="mqtt_sub"/> <!-- Su questo topic ricevero' un messaggio del tipo {request:descripion.json} Dovro' quindi mandare la mia descrizione json -->
+</set>
diff --git a/antifurto/res/CONF/deltaSensoriMovimento.json b/antifurto/res/CONF/deltaSensoriMovimento.json
index 798edf6..cfa0e95 100644
--- a/antifurto/res/CONF/deltaSensoriMovimento.json
+++ b/antifurto/res/CONF/deltaSensoriMovimento.json
@@ -1,5 +1 @@
-{
-    "IN1":33,
-    "IN2":4,
-    "IN3":8
-}
+{"IN6":33,"IN5":5,"IN2":4,"IN1":33,"IN3":8}
\ No newline at end of file
diff --git a/antifurto/res/CONF/zona.json b/antifurto/res/CONF/zona.json
index c58acf8..c2f6770 100644
--- a/antifurto/res/CONF/zona.json
+++ b/antifurto/res/CONF/zona.json
@@ -1,9 +1 @@
-{
-    "interruttore": "IN0",
-    "sensoriMovimento": [
-      "IN1",
-      "IN2",
-      "IN3"
-    ],
-    "outputSuono":"OUT0"
-}
+{"interruttore":"IN0","sensoriMovimento":["IN1","IN2","IN3","IN5","IN6"],"outputSuono":"OUT0", "nomeOutputAntifurto":"OUT1"}
diff --git a/antifurto/res/stato.json b/antifurto/res/stato.json
index 13ac491..a8a6224 100644
--- a/antifurto/res/stato.json
+++ b/antifurto/res/stato.json
@@ -1 +1 @@
-{"stato":0,"valore":0,"codaVal":[],"codaMsg":[{"msg":{"status":{"stato":0,"interruttore":"off","allarme":"off"}},"topic":"from/gruppo2/luci/antifurto"},{"msg":{"status":{"stato":0,"interruttore":"off","allarme":"off"}},"topic":"from/gruppo2/luci/antifurto"},{"msg":{"status":{"stato":0,"interruttore":"off","allarme":"off"}},"topic":"from/gruppo2/luci/antifurto"}]}
\ No newline at end of file
+{"soglia":30,"stato":0,"valore":0,"tempoAllarme":"2022-07-24T19:48:50.175953"}
\ No newline at end of file
diff --git a/antifurto/src/code/Antifurto.java b/antifurto/src/code/Antifurto.java
index a0c44f8..9c13607 100644
--- a/antifurto/src/code/Antifurto.java
+++ b/antifurto/src/code/Antifurto.java
@@ -20,6 +20,8 @@ public class Antifurto {
 	private static String brokerUrl;
 	private String interruttore;
 	private String interruttoreOutputSuono;
+	private String nomeOutputAntifurto;
+	private static JSONArray sensori;  // sensori di movimento
 	private static ArrayList<String> topicsSub;
 	private Date date = new Date();
 	private String clientId = Long.toString(date.getTime()) + "-sub-pub"; // unique client id
@@ -30,11 +32,12 @@ public class Antifurto {
 	private static String mqttSubdomain;
 	
 	private final String CONF_FILE = "../res/CONF/conf.json";
-	private final String CONF_ZONA = "../res/CONF/zona.json";
+	public static final String CONF_ZONA = "../res/CONF/zona.json";
+	
 	public Antifurto(Automa automa) throws JSONException, IOException, MqttException {
 		this.automa = automa;
 		
-		JSONObject jsonObject = new JSONObject(leggiFile(CONF_FILE));
+		JSONObject jsonObject = new JSONObject(Helper.leggiFile(CONF_FILE));
 		brokerUrl = jsonObject.getString("protocol") + "://" + jsonObject.getString("broker") + ":" + jsonObject.getInt("port");
 		mqttDomain = jsonObject.getString("mqttDomain");
 		mqttSubdomain = jsonObject.getString("mqttSubdomain");
@@ -45,22 +48,32 @@ public class Antifurto {
 		topicsSub.add("to/all"); 
 		
 		// Su questo topic ricevero' le richieste di inviare il mio stato attuale
-		topicsSub.add("rpc/"+mqttDomain+"/"+mqttSubdomain+"/antifurto");
+		topicsSub.add("rpc/"+getMqttTree()+"/antifurto");
 		
 		
-		jsonObject = new JSONObject(leggiFile(CONF_ZONA));
+		jsonObject = new JSONObject(Helper.leggiFile(CONF_ZONA));
 		interruttore = jsonObject.getString("interruttore"); 
-		topicsSub.add("from/"+mqttDomain+"/"+mqttSubdomain+"/gpio/" + interruttore); // Sottoscrivo i messaggi che notificano il cambiamento di stato dell'interruttore
+		
+		topicsSub.add("from/"+getMqttTree()+"/gpio/" + interruttore); // Sottoscrivo i messaggi che notificano il cambiamento di stato dell'interruttore
 		
 		// Per ogni sensore di movimento, sottoscrivo i messaggi che notificano il loro cambiamento di stato 
-		JSONArray sensori = jsonObject.getJSONArray("sensoriMovimento");
+		sensori = jsonObject.getJSONArray("sensoriMovimento");
 		for(int i=0; i<sensori.length(); i++) {
-			topicsSub.add("from/"+mqttDomain+"/"+mqttSubdomain+"/gpio/" + sensori.get(i)); 
+			topicsSub.add("from/"+getMqttTree()+"/gpio/" + sensori.get(i)); 
 		}
 		
+		nomeOutputAntifurto = jsonObject.getString("nomeOutputAntifurto");
+		topicsSub.add("from/"+getMqttTree()+"/gpio/" + nomeOutputAntifurto);
+		
 		interruttoreOutputSuono = jsonObject.getString("outputSuono");
-		topicsSub.add("from/"+mqttDomain+"/"+mqttSubdomain+"/gpio/" + interruttoreOutputSuono); // Sottoscrivo i messaggi che notificano il cambiamento di stato dell'interruttore
+		topicsSub.add("from/"+getMqttTree()+"/gpio/" + interruttoreOutputSuono); // Sottoscrivo i messaggi che notificano il cambiamento di stato dell'interruttore
+		
 		
+		topicsSub.add("to/"+getMqttTree()+"/antifurto/soglia"); // Su questo topic mi arrivera' un messaggio {"soglia": 30} e dovrò impostare la soglia di conseguenza
+		
+		topicsSub.add("conf/"+getMqttTree()+"/antifurto/sensore"); // Su questo topic mi arrivera' un messaggio per l'aggiunta di un sensore di movimento. 
+																   // Ad esempio se mi arriva il messaggio {"in": "IN3", "delta":33 } devo aggiungere il sensore di movimento che si 
+																   // chiama IN3, il cui valore di delta e' 33 (devo quindi aggiornare il file deltaSensoriMovimento.json
 		
 		this.mqttClient = new MqttClient(brokerUrl, clientId, new MemoryPersistence());
 		
@@ -69,13 +82,18 @@ public class Antifurto {
 	public void startClient(Esecutore esec, Publisher publisher) throws MqttException {
 		MqttConnectOptions options = new MqttConnectOptions();
 		options.setCleanSession(false);
-		mqttClient.setCallback(new SubscribeCallback(this, publisher, interruttore, interruttoreOutputSuono, esec, automa));
+		mqttClient.setCallback(new SubscribeCallback(this, publisher, interruttore, interruttoreOutputSuono, esec, automa, nomeOutputAntifurto));
 		
 		mqttClient.connect(options);
 		
 		
 		for(String t: topicsSub) 
-			mqttClient.subscribe(t);
+			addTopicToSubscribe(t);
+	}
+	
+	// sottoscrive il topic passato come parametro
+	public void addTopicToSubscribe(String topic) throws MqttException {
+		mqttClient.subscribe(topic);
 	}
 	
 	public void publishMethod(String topic, String msg) throws MqttException {
@@ -83,17 +101,17 @@ public class Antifurto {
 		msgTopic.publish(new MqttMessage(msg.getBytes()));
 	}
 	
-	private String leggiFile(String path) throws IOException {
-		String line;
-		String answer = "";
-		FileReader fileReader = new FileReader(path);
-		BufferedReader bufferedReader = new BufferedReader(fileReader);
-		while((line = bufferedReader.readLine()) != null) {
-			answer += line;
-		}
-		bufferedReader.close();
-		return answer;
-	}
+//	private String leggiFile(String path) throws IOException {
+//		String line;
+//		String answer = "";
+//		FileReader fileReader = new FileReader(path);
+//		BufferedReader bufferedReader = new BufferedReader(fileReader);
+//		while((line = bufferedReader.readLine()) != null) {
+//			answer += line;
+//		}
+//		bufferedReader.close();
+//		return answer;
+//	}
 	
 	
 	
@@ -180,7 +198,7 @@ public class Antifurto {
 		Antifurto antifurto = new Antifurto(automa);
 		Publisher publisher = new Publisher(codaMsg, antifurto);
 		Esecutore esec = new Esecutore(publisher, codaVal, automa, antifurto.interruttoreOutputSuono);
-		Timer timer = new Timer(30000,-5,esec,automa);
+		Timer timer = new Timer(6000,-1,esec,automa);
 		
 		antifurto.startClient(esec, publisher);
 		publisher.start();
@@ -188,11 +206,21 @@ public class Antifurto {
 		timer.start();
 	}
 
+	public static void stopSystem() {
+		
+	}
 	
 	public static String getMqttTree() {
 		return mqttDomain+"/"+mqttSubdomain;
 	}
 
+	public static JSONArray getSensori() {
+		return sensori;
+	}
+	
+	public static void addSensore(String newSensore) { // aggiunge un sensore di movimento
+		sensori.put(newSensore);
+	}
 	
 
 }
diff --git a/antifurto/src/code/Automa.java b/antifurto/src/code/Automa.java
index 8e5baa6..9b0a8e8 100644
--- a/antifurto/src/code/Automa.java
+++ b/antifurto/src/code/Automa.java
@@ -1,8 +1,4 @@
 package code;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.FileReader;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -18,7 +14,7 @@ public class Automa {
 	private String statoSuono;
 	private static final String FILE_AUTOMA = "../res/automa.json";
 	public static final String FILE_STATO = "../res/stato.json";
-	private static final String FILE_DELTA_SENSORI = "../res/CONF/deltaSensoriMovimento.json";
+	public static final String FILE_DELTA_SENSORI = "../res/CONF/deltaSensoriMovimento.json";
 	
 	
 	public Automa() throws JSONException, IOException {
@@ -29,7 +25,7 @@ public class Automa {
 	
 	
 	private synchronized void setStati(boolean write) throws JSONException, IOException {
-		JSONObject statoJson = new JSONObject(Helper.leggiFile(FILE_STATO));
+		JSONObject statoJson = new JSONObject(Helper.leggiFile(FILE_STATO)); 
 		if(write) {
 			// devo aggiornare lo stato nel FILE_STATO
 			Helper.scriviFile(statoJson.put("stato",this.statoAttuale), FILE_STATO);
@@ -37,14 +33,15 @@ public class Automa {
 		else {
 			// devo capire in quale stato mi trovo e impostare di conseguenza lo statoInterruttore e lo statoSuono
 			this.statoAttuale = statoJson.getInt("stato");
-			aggiornaInterruttoreESuono();	
 		}
+		aggiornaInterruttoreESuono();
 	}
 	
 	
 	private void riempiHashTable() throws JSONException, IOException {
 		this.deltaSensori = new Hashtable<String, Integer>();
 		JSONObject jsObj = new JSONObject(Helper.leggiFile(FILE_DELTA_SENSORI));
+		@SuppressWarnings("unchecked")
 		Iterator<String> keys = jsObj.keys();
 		while(keys.hasNext()) {
 			String key = keys.next();
@@ -53,6 +50,10 @@ public class Automa {
 		}
 	}
 	
+	public void addDeltaSensori(String nomeSensore, int delta) {
+		deltaSensori.put(nomeSensore, delta);
+	}
+	
 //	private synchronized void scriviFile(JSONObject json, String path) throws IOException {
 //		BufferedWriter b = new BufferedWriter(new FileWriter(path));
 //		b.write(json.toString());
@@ -93,6 +94,7 @@ public class Automa {
 	
 	// e' cambiato lo stato dell'interruttore, per cui cerco nel file json in quale nuovo stato devo andare
 	private synchronized void calcolaNuovoStatoMsgFromInterruttore(String newStatoInterruttore) throws JSONException, IOException {
+		@SuppressWarnings("unchecked")
 		Iterator<String> keys = jsonObject.keys();
 		while(keys.hasNext()) {
 			String key = keys.next();
@@ -100,12 +102,12 @@ public class Automa {
 			if(riga.getInt("stato")==statoAttuale) {
 				this.statoAttuale = riga.getInt("cmd"+newStatoInterruttore);
 				setStati(true); //scrivo nel file il nuovo stato in cui mi trovo
-				aggiornaInterruttoreESuono();
 			}
 		}
 	}
 	//in base allo stato attuale dell'antifurto, calcolo lo stato dell'interruttore e del suono
 	private synchronized void aggiornaInterruttoreESuono() throws JSONException {
+		@SuppressWarnings("unchecked")
 		Iterator<String> keys = jsonObject.keys();
 		while(keys.hasNext()) {
 			String key = keys.next();
@@ -124,6 +126,7 @@ public class Automa {
 			jsonKey = "eventValMaggioreSoglia";
 		else
 			jsonKey = "eventValMinoreSoglia";
+		@SuppressWarnings("unchecked")
 		Iterator<String> keys = jsonObject.keys();
 		while(keys.hasNext()) {
 			String key = keys.next();
@@ -131,7 +134,6 @@ public class Automa {
 			if(riga.getInt("stato")==statoAttuale) {
 				this.statoAttuale = riga.getInt(jsonKey);
 				setStati(true); //scrivo nel file il nuovo stato in cui mi trovo
-				aggiornaInterruttoreESuono();
 			}
 		}
 	}
@@ -149,8 +151,8 @@ public class Automa {
 	}
 	
 	
-	public synchronized String getStatoAutoma() {
-		return "{\"stato\":"+statoAttuale+",\"interruttore\":\""+statoInterruttore+"\",\"allarme\":\""+statoSuono+"\"}";
+	public synchronized int getStatoAutoma() {
+		return statoAttuale;
 	}
 	
 	
@@ -163,6 +165,14 @@ public class Automa {
 		return statoSuono;
 	}
 	
+	public synchronized boolean getStatoSuonoTrueFalse() {
+		return statoSuono.equals("on");
+	}
+	
+	public synchronized boolean getStatoInterrutoreTrueFalse() {
+		return statoInterruttore.equals("on");
+	}
+	
 	
 	// Ritorna true se l'antifurto e' attivo
 	public synchronized boolean antifurtoAttivo() {
diff --git a/antifurto/src/code/Esecutore.java b/antifurto/src/code/Esecutore.java
index ff582c0..77614b9 100644
--- a/antifurto/src/code/Esecutore.java
+++ b/antifurto/src/code/Esecutore.java
@@ -2,8 +2,10 @@ package code;
 import java.io.IOException;
 import java.time.Duration;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
 
-import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
@@ -12,11 +14,12 @@ public class Esecutore extends Thread {
 	
 	private MyQueue<Integer> codaVal; // coda in cui vengono mantenuti i valori da sommare alla variabile valore
 	private int valore; // variabile numerica cumulativa inizialmente impostata a 0
-	private static  int soglia = 100;
+	private static  int soglia;
 	private Publisher publisher;
 	private Automa automa;
 	private String outputSuono; // nome logico dell'interruttore che fa scattare il suono dell'allarme 
 	private LocalDateTime tempoAllarme; //valorizzato solo quando l'allarme sta suonando. Contiene l'ora in cui l'allarme ha iniziato a suonare 
+	private static long allarmeTimeout;
 	
 	public Esecutore(Publisher publisher, MyQueue<Integer> codaVal, Automa automa, String outputSuono) throws JSONException, IOException {
 		this.codaVal = codaVal;
@@ -26,26 +29,41 @@ public class Esecutore extends Thread {
 		
 		JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
 		this.valore = statoJson.getInt("valore");
+		setSoglia(statoJson.getInt("soglia"));
 		if(statoJson.getInt("stato")==2)
 			this.tempoAllarme = LocalDateTime.parse(statoJson.getString("tempoAllarme"));
 	}
 	
+	private int getSogliaMax() {
+		return Math.round(soglia+soglia*0.2f);  // il valore non puo' andare oltre il 20 % sopra la soglia 
+	}
 	
 	public void run() {
-		final long DURATA_SUONO = 5; // l'allarme dura 5 minuti e poi smette di suonare
+		final long DURATA_SUONO = 5; // l'allarme dura 5 minuti e poi smette di suonare. 
 		int delta;
+		int valoreToSend = valore; // ogni volta che aumento / diminuisco il valore di 5, notifico la web app pubblicando un messaggio 
 		while(true) {
 			while(automa.antifurtoAttivo()) { System.out.println("VALORE = "+ valore);
 				delta = codaVal.receive();
 				valore = valore + delta;
-				
+				if(valore < 0)
+					valore = 0;
+				if(valore > getSogliaMax())
+					valore = getSogliaMax();
 				try {
-					Helper.modificaFileStato(codaVal, false, delta, valore, Automa.FILE_STATO);
-					if(valore >= soglia && (!automa.allarme()) ) {	
+					if(Math.abs(valore-valoreToSend) >= 5) {
+						JSONObject msgJson = new JSONObject();
+						msgJson.put("event", valore);
+						publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/valore", msgJson.toString());
+						valoreToSend = valore;
+					}
+					
+					JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
+					statoJson.put("valore", valore);
+					if(valore >= soglia && (!automa.allarme()) && delta>0) {	
 						publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+outputSuono, "{cmd:1}");
 						tempoAllarme = LocalDateTime.now();
-						JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
-						Helper.scriviFile(statoJson.put("tempoAllarme",tempoAllarme.toString()), Automa.FILE_STATO);
+						statoJson.put("tempoAllarme",tempoAllarme.toString());
 					}
 					else {
 						if(automa.allarme()) {
@@ -56,6 +74,8 @@ public class Esecutore extends Thread {
 							}
 						}
 					}
+					statoJson.put("soglia", soglia);
+					Helper.scriviFile(statoJson, Automa.FILE_STATO); 
 				}
 				catch (JSONException e) {
 					e.printStackTrace();
@@ -72,7 +92,6 @@ public class Esecutore extends Thread {
 
 	
 	public void aggiungiVal(int n) {
-		Helper.modificaFileStato(true, n, Automa.FILE_STATO);
 		codaVal.send(n);
 	}
 	
@@ -81,6 +100,23 @@ public class Esecutore extends Thread {
 		codaVal.removeAll();
 	}
 	
+	public static int getSoglia() {
+		return soglia;
+	}
 	
+	public int getValore() {
+		return valore;
+	}
+	
+	public static long getAllarmeTimeout() {
+		return allarmeTimeout;
+	}
+	
+	public static void setSoglia(int newValue) throws JSONException, IOException {
+		JSONObject js = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
+		js.put("soglia", newValue);
+		Helper.scriviFile(js, Automa.FILE_STATO);
+		soglia = newValue;
+	}
 	
 }
diff --git a/antifurto/src/code/Helper.java b/antifurto/src/code/Helper.java
index b765038..7732e4c 100644
--- a/antifurto/src/code/Helper.java
+++ b/antifurto/src/code/Helper.java
@@ -31,93 +31,93 @@ public class Helper {
 	
 	// se add = true, aggiungo il valore n alla codaVal; 
 	// se add = false, rimuovo il valore n dalla codaVal
-	public static synchronized void modificaFileStato(MyQueue<Integer> coda, boolean add, int n, int valore, String path) {
-		try {
-			JSONObject statoJson = new JSONObject(Helper.leggiFile(path));
-			statoJson.put("valore",valore);
-			JSONArray arrayCodaVal = statoJson.getJSONArray("codaVal");
-			if(add)
-				arrayCodaVal.put(n);
-			else {
-				int index = -1;
-				for(int i=0; i<arrayCodaVal.length(); i++) {
-					if(arrayCodaVal.getInt(i)==n)
-						index = i;
-				}
-				arrayCodaVal.remove(index);
-			}
-			Helper.scriviFile(statoJson.put("codaVal",arrayCodaVal), path);
-		} catch (JSONException e) {
-			e.printStackTrace();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
+//	public static synchronized void modificaFileStato(MyQueue<Integer> coda, boolean add, int n, int valore, String path) {
+//		try {
+//			JSONObject statoJson = new JSONObject(Helper.leggiFile(path));
+//			statoJson.put("valore",valore);
+//			JSONArray arrayCodaVal = statoJson.getJSONArray("codaVal");
+//			if(add)
+//				arrayCodaVal.put(n);
+//			else {
+//				int index = -1;
+//				for(int i=0; i<arrayCodaVal.length(); i++) {
+//					if(arrayCodaVal.getInt(i)==n)
+//						index = i;
+//				}
+//				arrayCodaVal.remove(index);
+//			}
+//			Helper.scriviFile(statoJson.put("codaVal",arrayCodaVal), path);
+//		} catch (JSONException e) {
+//			e.printStackTrace();
+//		} catch (IOException e) {
+//			e.printStackTrace();
+//		}
+//	}
+//	
+//	public static synchronized void modificaFileStato(boolean add, int n, String path) {
+//		try {
+//			JSONObject statoJson = new JSONObject(Helper.leggiFile(path));
+//			JSONArray arrayCodaVal = statoJson.getJSONArray("codaVal");
+//			if(add)
+//				arrayCodaVal.put(n);
+//			else {
+//				int index = -1;
+//				for(int i=0; i<arrayCodaVal.length(); i++) {
+//					if(arrayCodaVal.getInt(i)==n)
+//						index = i;
+//				}
+//				arrayCodaVal.remove(index);
+//			}
+//			Helper.scriviFile(statoJson.put("codaVal",arrayCodaVal), path);
+//		} catch (JSONException e) {
+//			e.printStackTrace();
+//		} catch (IOException e) {
+//			e.printStackTrace();
+//		}
+//	}
+//
+//	public static synchronized void modificaFileStato(boolean add, Pair p, String path) {
+//		try { System.out.println("pair = " + p+ " path  = " + path);
+//			JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); 
+//			JSONArray arrayCodaMsg = statoJson.getJSONArray("codaMsg"); 
+//			if(add) 
+//				arrayCodaMsg.put(p.toJsonObject());
+//			else {
+//				int index = -1;
+//				for(int i=0; i<arrayCodaMsg.length(); i++) {
+//					JSONObject msgJson = arrayCodaMsg.getJSONObject(i); 
+//					if(msgJson.getString("topic").equals(p.getTopic()) && msgJson.getJSONObject("msg").toString().equals(p.getMsg()) )
+//						index = i;
+//				}
+//				arrayCodaMsg.remove(index);
+//			}
+//			Helper.scriviFile(statoJson.put("codaMsg",arrayCodaMsg), path);  System.out.println("FINE");
+//		} catch (JSONException e) {
+//			e.printStackTrace();
+//		} catch (IOException e) {
+//			e.printStackTrace();
+//		}
+//	}
 	
-	public static synchronized void modificaFileStato(boolean add, int n, String path) {
-		try {
-			JSONObject statoJson = new JSONObject(Helper.leggiFile(path));
-			JSONArray arrayCodaVal = statoJson.getJSONArray("codaVal");
-			if(add)
-				arrayCodaVal.put(n);
-			else {
-				int index = -1;
-				for(int i=0; i<arrayCodaVal.length(); i++) {
-					if(arrayCodaVal.getInt(i)==n)
-						index = i;
-				}
-				arrayCodaVal.remove(index);
-			}
-			Helper.scriviFile(statoJson.put("codaVal",arrayCodaVal), path);
-		} catch (JSONException e) {
-			e.printStackTrace();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-
-	public static synchronized void modificaFileStato(boolean add, Pair p, String path) {
-		try {
-			JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); 
-			JSONArray arrayCodaMsg = statoJson.getJSONArray("codaMsg"); 
-			if(add) 
-				arrayCodaMsg.put(p.toJsonObject());
-			else {
-				int index = -1;
-				for(int i=0; i<arrayCodaMsg.length(); i++) {
-					JSONObject msgJson = arrayCodaMsg.getJSONObject(i); 
-					if(msgJson.getString("topic").equals(p.getTopic()) && msgJson.getJSONObject("msg").toString().equals(p.getMsg()) )
-						index = i;
-				}
-				arrayCodaMsg.remove(index);
-			}
-			Helper.scriviFile(statoJson.put("codaMsg",arrayCodaMsg), path);
-		} catch (JSONException e) {
-			e.printStackTrace();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	public static synchronized <T> void getFromFileStato(MyQueue<T> coda, String key, String path) throws JSONException, IOException {
-		JSONObject statoJson = new JSONObject(Helper.leggiFile(path));
-		JSONArray arrayCoda = statoJson.getJSONArray(key);
-		if(coda.getClass().equals(Pair.class)) {
-			MyQueue<Pair> codaMsg = (MyQueue<Pair>) coda;
-			for(int i = 0; i<arrayCoda.length(); i++) {
-				JSONObject pairJson = arrayCoda.getJSONObject(i);
-				Pair p = new Pair(pairJson.getString("topic"), pairJson.getString("msg"));
-				codaMsg.send(p);
-				
-			}
-		}
-		if(coda.getClass().equals(Integer.class)) {
-			MyQueue<Integer> codaVal = (MyQueue<Integer>) coda;
-			for(int i = 0; i<arrayCoda.length(); i++) {
-				codaVal.send(arrayCoda.getInt(i));
-			}
-		}
-			
-	}
+//	public static synchronized <T> void getFromFileStato(MyQueue<T> coda, String key, String path) throws JSONException, IOException {
+//		JSONObject statoJson = new JSONObject(Helper.leggiFile(path));
+//		JSONArray arrayCoda = statoJson.getJSONArray(key);
+//		if(coda.getClass().equals(Pair.class)) {
+//			MyQueue<Pair> codaMsg = (MyQueue<Pair>) coda;
+//			for(int i = 0; i<arrayCoda.length(); i++) {
+//				JSONObject pairJson = arrayCoda.getJSONObject(i);
+//				Pair p = new Pair(pairJson.getString("topic"), pairJson.getString("msg"));
+//				codaMsg.send(p);
+//				
+//			}
+//		}
+//		if(coda.getClass().equals(Integer.class)) {
+//			MyQueue<Integer> codaVal = (MyQueue<Integer>) coda;
+//			for(int i = 0; i<arrayCoda.length(); i++) {
+//				codaVal.send(arrayCoda.getInt(i));
+//			}
+//		}
+//			
+//	}
 	
 }
diff --git a/antifurto/src/code/Pair.java b/antifurto/src/code/Pair.java
index 87880af..977d71e 100644
--- a/antifurto/src/code/Pair.java
+++ b/antifurto/src/code/Pair.java
@@ -22,10 +22,18 @@ public class Pair {
 	}
 	
 	public JSONObject toJsonObject() throws JSONException {
-		return new JSONObject(toString());
+		JSONObject js = new JSONObject();
+		js.put("topic", topic);
+		js.put("msg", msg); System.out.println(msg);
+		return js;
 	}
 	
 	public String toString() {
-		return "{\"topic\":\""+topic+"\",\"msg\":"+msg+"}";
+		try {
+			return toJsonObject().toString();
+		} catch (JSONException e) {
+			e.printStackTrace();
+		}
+		return null;
 	}
 }
diff --git a/antifurto/src/code/Publisher.java b/antifurto/src/code/Publisher.java
index 5326a20..becc9b0 100644
--- a/antifurto/src/code/Publisher.java
+++ b/antifurto/src/code/Publisher.java
@@ -13,8 +13,7 @@ public class Publisher extends Thread {
 	}
 	
 	public void aggiungiComando(String topic, String msg) {
-		Pair p = new Pair(topic, msg); 
-		Helper.modificaFileStato(true, p, Automa.FILE_STATO);
+		Pair p = new Pair(topic, msg);  
 		coda.send(p);
 	}
 	
@@ -22,7 +21,6 @@ public class Publisher extends Thread {
 	public void run() {
 		while(true) {
 			Pair p = coda.receive();
-			Helper.modificaFileStato(false, p, Automa.FILE_STATO);
 			try {
 				client.publishMethod(p.getTopic(), p.getMsg());
 			} catch (MqttException e) {
diff --git a/antifurto/src/code/SubscribeCallback.java b/antifurto/src/code/SubscribeCallback.java
index a28648b..77e98d5 100644
--- a/antifurto/src/code/SubscribeCallback.java
+++ b/antifurto/src/code/SubscribeCallback.java
@@ -15,14 +15,16 @@ public class SubscribeCallback implements MqttCallback{
 	private Publisher publisher;
 	private String nomeInterruttore; 
 	private String nomeOutputSuono;
+	private String nomeOutputAntifurto;
 	private Esecutore esec;
 	private Automa automa;
 	
-	public SubscribeCallback(Antifurto client, Publisher publisher, String nomeInterruttore, String nomeOutputSuono, Esecutore esec, Automa automa) {
+	public SubscribeCallback(Antifurto client, Publisher publisher, String nomeInterruttore, String nomeOutputSuono, Esecutore esec, Automa automa, String nomeOutputAntifurto) {
 		this.client = client;
 		this.publisher = publisher;
 		this.nomeInterruttore = nomeInterruttore;
 		this.nomeOutputSuono = nomeOutputSuono;
+		this.nomeOutputAntifurto = nomeOutputAntifurto;
 		this.esec = esec;
 		this.automa = automa;
 	}
@@ -57,45 +59,62 @@ public class SubscribeCallback implements MqttCallback{
 	
 
 	@Override
-	public void messageArrived(String topic, MqttMessage message) throws Exception {
-		System.out.println("nuovo: "+topic+" ; "+message.toString());
+	public void messageArrived(String topic, MqttMessage message) throws Exception { 
+		
 		if(topic.equals("to/all")) {
 			System.out.println("MESSAGGIO MQTT = "+message.toString());
 			if(message.toString().equals("{request:description}"))
 				sendDescription("from/"+Antifurto.getMqttTree()+"/antifurto/description");
 			if(message.toString().equals("{request:status}"))
-				sendMyState("from/"+Antifurto.getMqttTree()+"/antifurto");
+				sendMyStateToAll("from/"+Antifurto.getMqttTree()+"/antifurto");  // DA FARE: vedi cosa pubblicano gli altri microservizi e implementa di conseguenza questa funzione
 		}
 		else {
-			if(topic.equals("rpc/"+Antifurto.getMqttTree()+"/antifurto")) // DA FARE: capire quale messaggio voglio ricevere per poi pubblicare il mio stato
-				// DA FARE: vedi foto foglio Alfredo
-				sendMyState("from/"+Antifurto.getMqttTree()+"/antifurto"); // CONTROLLA SE VA BENE PUBBLICARE LO STATO SU QUESTO TOPIC O SE IL TOPIC DEVE ESSERE UN'ALTRO. NOTA: NON POSSO PUBBLICARE SULLO STESSO TOPIC CHE HO SOTTOSCRITTO
+			JSONObject msgJson = new JSONObject(message.toString());
+			if(topic.equals("conf/"+Antifurto.getMqttTree()+"/antifurto/sensore")) {
+				if(msgJson.has("in") && msgJson.has("delta")) 
+					handleConfSensoreMovimento(msgJson);
+			}
 			else {
-				JSONObject msgJson = new JSONObject(message.toString());
-				
-				if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputSuono)) {
-					int newStatus = -1;
-					if(msgJson.has("status"))
-						newStatus = msgJson.getInt("status");
-					else {
-						if(msgJson.has("event"))
-							newStatus = msgJson.getInt("event");
-					}
-					handleStateMsgFromOutputSuono(newStatus);
+				if(topic.equals("to/"+Antifurto.getMqttTree()+"/antifurto/soglia") && msgJson.has("soglia")) {
+					handleSetSoglia(msgJson);
 				}
 				else {
-					int event = msgJson.getInt("event");
-					if(event==1) {
-						// e' stato premuto l'interruttore / il sensore di movimento ha rilevato qualcuno
-						if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeInterruttore))
-							handleStateMsgFromInterruttore();
-						else {
-							// il topic sara' from/gruppo2/luci/gpio/IN0  dove IN0 e' un sensore di movimento
-							String[] t = topic.split("/");
-							handleMovimento(t[4]);
+					if(topic.equals("rpc/"+Antifurto.getMqttTree()+"/antifurto") && message.toString().equals("{\"request\":\"description\"}"))
+						sendMyState("from/"+Antifurto.getMqttTree()+"/antifurto");  
+					else {
+						if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputSuono)) {
+							int newStatus = -1;
+							if(msgJson.has("status"))
+								newStatus = msgJson.getInt("status");
+							else {
+								if(msgJson.has("event"))
+									newStatus = msgJson.getInt("event");
+							}
+							handleStateMsgFromOutputSuono(newStatus);
 						}
-					}
-				}				
+						else {
+							if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputAntifurto)) {
+								if(msgJson.has("event"))
+									handleLuceAntifurto();
+							}
+							else {
+								int event = msgJson.getInt("event");
+								if(event==1) {
+									// e' stato premuto l'interruttore / il sensore di movimento ha rilevato qualcuno
+									if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeInterruttore))
+										handleStateMsgFromInterruttore();
+									else {
+										// il topic sara' from/gruppo2/luci/gpio/IN0  dove IN0 e' un sensore di movimento
+										System.out.println("TOPIC = "+topic);
+										String[] t = topic.split("/");
+										handleMovimento(t[4]);
+									}
+								}
+							}
+						}				
+					}					
+				}
+				
 			}
 		}	
 		
@@ -104,12 +123,28 @@ public class SubscribeCallback implements MqttCallback{
 
 	
 	private synchronized void handleStateMsgFromInterruttore() throws JSONException, IOException {
+		if(automa.getStatoInterruttore().equals("on")) 
+			publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputAntifurto, "{cmd:0}"); // voglio spegnere l'antifurto, quindi invio un messaggio per spegnere la luce che indica che l'antifurto e' acceso
+		else 
+			publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputAntifurto, "{cmd:1}"); // voglio accendere l'antifurto, quindi invio un messaggio per accendere la luce che indica che l'antifurto e' acceso
+	}
+	
+	private synchronized void handleLuceAntifurto() throws JSONException {
+		try {
 		automa.changeStatoInterruttore();
 		if(automa.getStatoInterruttore().equals("off")) {
 			publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputSuono, "{cmd:0}"); 
 			esec.reset();
+		}		
+		JSONObject js = new JSONObject();
+		js.put("event", automa.getStatoInterrutoreTrueFalse());
+		publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/antifurto", js.toString());
+		}
+		catch(IOException e) {
+			JSONObject jsError = new JSONObject();
+			jsError.put("error", e.getMessage());
+			publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/antifurto", jsError.toString());
 		}
-		publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto", "{\"event\": {\"antifurto\":\""+automa.getStatoInterruttore()+"\",\"allarme\":\""+automa.getStatoSuono()+"\"}}");
 	}
 	
 	
@@ -118,7 +153,9 @@ public class SubscribeCallback implements MqttCallback{
 			String statusOnOff = automa.converter(newStatus); // lo stato e' della forma "on" oppure "off"
 			if(! statusOnOff.equals(automa.getStatoSuono()) ) {
 				automa.aggiornaStatoSuono(statusOnOff);
-				publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto", "{\"event\": {\"antifurto\":\""+automa.getStatoInterruttore()+"\",\"allarme\":\""+automa.getStatoSuono()+"\"}}");
+				JSONObject js = new JSONObject();
+				js.put("event", automa.getStatoSuonoTrueFalse());
+				publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/allarme", js.toString());
 			}
 		}
 	}
@@ -126,13 +163,62 @@ public class SubscribeCallback implements MqttCallback{
 
 	
 	
-	private void handleMovimento(String nomeSensore) {
+	private void handleMovimento(String nomeSensore) { 
 		if(automa.getStatoInterruttore().equals("on"))
 			esec.aggiungiVal(automa.getDelta(nomeSensore));
 	}
 	
-	private void sendMyState(String topic) throws MqttException {
-		publisher.aggiungiComando(topic, "{\"status\":"+automa.getStatoAutoma()+"}"); 		
+	private void handleConfSensoreMovimento(JSONObject toAdd) throws JSONException { 
+		// aggiorno il file che contiene l'associazione sensore-movimento, delta
+		try {
+			JSONObject sensori = new JSONObject(Helper.leggiFile(Automa.FILE_DELTA_SENSORI));
+			String nomeSensore = toAdd.getString("in").toUpperCase();
+			int delta = toAdd.getInt("delta");
+			sensori.put(nomeSensore, delta);
+			Helper.scriviFile(sensori, Automa.FILE_DELTA_SENSORI);
+			
+			// aggiorno il file zona: ho un sensore di movimento in più
+			JSONObject zona = new JSONObject(Helper.leggiFile(Antifurto.CONF_ZONA));
+			zona.getJSONArray("sensoriMovimento").put(nomeSensore);
+			Helper.scriviFile(zona, Antifurto.CONF_ZONA);
+			Antifurto.addSensore(nomeSensore);
+			automa.addDeltaSensori(nomeSensore, delta);
+			client.addTopicToSubscribe("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeSensore); System.out.println("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeSensore);
+			publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/sensore", toAdd.toString()); // invio questo messaggio per confermare alla web app che il sensore di movimento e' stato aggiunto		
+		} catch(IOException | MqttException e) {
+			JSONObject jsError = new JSONObject();
+			jsError.put("error", e.getMessage());
+			publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/sensore", jsError.toString());
+		}
+	}
+	
+	private void handleSetSoglia(JSONObject jsSoglia) throws JSONException {
+		try {
+			Esecutore.setSoglia(jsSoglia.getInt("soglia")); 
+			JSONObject jsToSend = new JSONObject();
+			jsToSend.put("soglia", Esecutore.getSoglia());
+			publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/soglia", jsToSend.toString());
+		} catch(IOException e) {
+			JSONObject jsError = new JSONObject();
+			jsError.put("error", e.getMessage());
+			publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/soglia", jsError.toString());
+		}
+	}
+	
+	private void sendMyState(String topic) throws MqttException, NumberFormatException, JSONException {
+		JSONObject json = new JSONObject();
+		json.put("stato", automa.getStatoAutoma());
+		json.put("interruttore", nomeInterruttore);
+		json.put("sensori-movimento", Antifurto.getSensori());
+		json.put("output-suono", nomeOutputSuono);
+		json.put("soglia", Esecutore.getSoglia());
+		json.put("allarme", automa.getStatoSuonoTrueFalse());
+		json.put("valore-attuale", esec.getValore());
+		json.put("antifurto", automa.getStatoInterrutoreTrueFalse());
+		long allarmeTimeout = Esecutore.getAllarmeTimeout();
+		if(automa.getStatoAutoma() == 2 && allarmeTimeout > 0)
+			json.put("allarme-timeout", allarmeTimeout);
+		publisher.aggiungiComando(topic, json.toString());		
 	}
 	
 	private void sendDescription(String topic) {
@@ -153,5 +239,9 @@ public class SubscribeCallback implements MqttCallback{
 //		publisher.aggiungiComando(topic, msg); 
 	}
 	
+	private void sendMyStateToAll(String topic) {
+		// DA FARE
+	}
+	
 
 }
-- 
GitLab