maxill1 / ialarm-mqtt

ialarm to mqtt bridge
MIT License
8 stars 3 forks source link

Mqttthing configuration support #17

Closed mrMiimo closed 2 years ago

mrMiimo commented 3 years ago

Hi, I have updated to the latest version and set port 18034. When I set a state in the alarm, I find "ERR | 00" in the log, is this normal?
Anyway at the moment everything seems to be work fine…

{
  commandNames: [ 'SetAlarmStatus' ],
  commandArgs: [ '1' ],
  data: { SetAlarmStatus: { event: 'response', response: [Object] } }
}
{
  commandNames: [ 'SetAlarmStatus' ],
  commandArgs: [ '1' ],
  data: { SetAlarmStatus: { event: 'response', response: [Object] } }
}
Connected to 192.168.178.33:18034
Connected to 192.168.178.33:18034
Disconnecting from 192.168.178.33:18034
Disconnecting from 192.168.178.33:18034
{
  status: { event: 'response', response: { Root: [Object], Err: 'ERR|00' } },
  zones: undefined
}
error
Caching ialarm/alarm/state until Sat Oct 09 2021 12:26:47 GMT+0000 (Coordinated Universal Time)
sending topic 'ialarm/alarm/state' : {"event":"response","response":{"Root":{"Pair":{"Client":{"Err":{}}}},"Err":"ERR|00"}}
No zone found to publish
Connected to 192.168.178.33:18034
Disconnecting from 192.168.178.33:18034
mrMiimo commented 3 years ago

I checked better, now strangely all the volumetric sensors are seen as detected movements.

this is the configuration:

{
        "accessory": "mqttthing",
        "type": "motionSensor",
        "name": "Esterno Soggiorno Giardino",
        "url": "mqtt://127.0.0.1:1883",
        "username": "XXXXXX",
        "password": "XXXXX",
        "caption": "Zona 33: Sensore Esterno Soggiorno",
        "topics": {
            "getMotionDetected": {
                "topic": "ialarm/sensors/state",
                "apply": "if (JSON.parse(message)[1].status > 0) return 1; else return 0;"
            },
            "getStatusActive": {
                "topic": "ialarm/sensors/state",
                "apply": "return JSON.parse(message)[1].ok;"
            },
            "getStatusFault": {
                "topic": "ialarm/sensors/state",
                "apply": "return JSON.parse(message)[1].fault;"
            },
            "getStatusLowBattery": {
                "topic": "ialarm/sensors/state",
                "apply": "return JSON.parse(message)[1].lowbat;"
            }
        },
        "integerValue": true
    },

1B3CDABE-D1CD-42C6-9F88-EA68C3B16140

maxill1 commented 3 years ago

Hi the "ERR" response error is related to a known issue: https://github.com/maxill1/node-ialarm/issues/7

I don't know much about mqttthing but some commit ago I changed some of the default device classes. You can configure them by overriding specific zones: https://github.com/maxill1/ialarm-mqtt/wiki/Configuration#specific-zone-config

mrMiimo commented 3 years ago

thanks for the feedback. I configured the specific zones, but it didn't work, they continue (doors and motion sensor) to be always active ... mqttthing simply define the sensor / device type and topics ... as I reported above

Maybe I do a rollback of the docker compose 😞

mrMiimo commented 3 years ago

🤷🏻‍♂️...the last docker image that works for me is maxill1/ialarm-mqtt:v0.7.4

maxill1 commented 3 years ago

Sorry now I get the problem: you are saying that getStatusActive reports "active" while it should not be.

Since TCP implementation (0.8.0) changed the default status to 1, your getMotionDetected topic is getting bad readings.

You can change your configuration like this:

          "getMotionDetected": {
                "topic": "ialarm/sensors/state",
                "apply": "if (JSON.parse(message)[1].status > 1) return 1; else return 0;"
            },

keep in mind that using "status" greater than 1 may results in "motion detection" in any of this case:

mrMiimo commented 3 years ago

Thanks for the list of all the values that can take "state", it is clarifying.

I took a test, it works! 👍🏼 But I also had to change the reading order of the string. Although I have specified the active zones with: "zones": [7,33,34,35,36,38,39,40], it now lists all 40 zones.

Does the option that specify active zones still work?

"server" : {
        "host": "192.168.178.33",
        "port": "18034",
        "username": "XXXXX",
        "password": "XXXX",
    "hadiscovery": {"enabled" : false},
        "zones": [7,33,34,35,36,38,39,40],
        "polling" : {
            "status" : 3500,
            "events" : 400000
        }

The last thing, the mqttthing logs now says (rightly) the "Fault" value is not an integer. I need to figure out how to fix it ...🤨

[10/10/2021, 11:48:09 AM] [Esterno Soggiorno Giardino] Ignoring invalid value [false] for Status Fault - not an integer

Mqttthing configuration:

{
    "accessory": "mqttthing",
    "type": "motionSensor",
    "name": "Esterno Soggiorno Giardino",
    "url": "mqtt://XXXXXX:1883",
    "username": "XXXXXX",
    "password": "XXXXX",
    "caption": "Zona 33: Sensore Esterno Soggiorno",
    "topics": {
        "getMotionDetected": {
            "topic": "ialarm/sensors/state",
            "apply": "if (JSON.parse(message)[32].status > 1) return 1; else return 0;"
        },
        "getStatusActive": {
            "topic": "ialarm/sensors/state",
            "apply": "return JSON.parse(message)[32].ok;"
        },
        "getStatusFault": {
            "topic": "ialarm/sensors/state",
            "apply": "return JSON.parse(message)[32].fault;"
        },
        "getStatusLowBattery": {
            "topic": "ialarm/sensors/state",
            "apply": "return JSON.parse(message)[32].lowbat;"
        }
    },
    "integerValue": true
}
maxill1 commented 3 years ago

"zones" filter should work, tomorrow I will give it a try and report back.

About the integer issue, you have configured mqttthing with:

"integerValue": true

So It expect all the "apply" functions to return an integer while ialarm-mqtt returns boolean for fault, etc...i recall that i introduced in "scraper" version a feature to change on/off payload in config.json. I will check if i broke that too..

mrMiimo commented 3 years ago

let me know if you need more information or the config.json file

maxill1 commented 3 years ago

no no, it's a bug! confirmed. WIP.

mrMiimo commented 3 years ago

kk 👍🏼, let me know when to update

maxill1 commented 3 years ago

pull the dev tag (maxill1/ialarm-mqtt:dev) and let me know if it's working

mrMiimo commented 3 years ago

"Zones", seems to work! Thanks! I keep seeing in the logs:

[Esterno Soggiorno Giardino] Ignoring invalid value [true] for Status Fault - not an integer

Maybe setting mqttthing this way works.

"getStatusLowBattery": {
                     "topic": "ialarm/sensors/state",
                     "apply": "if (JSON.parse (message) [7].lowbat = 'true') return 1; else return 0;"
                 }

It is difficult to simulate "lowbat", what do you think?

maxill1 commented 3 years ago

"Zones", seems to work! Thanks! I keep seeing in the logs:

[Esterno Soggiorno Giardino] Ignoring invalid value [true] for Status Fault - not an integer

Maybe setting mqttthing this way works.

"getStatusLowBattery": {
                   "topic": "ialarm/sensors/state",
                   "apply": "if (JSON.parse (message) [7].lowbat = 'true') return 1; else return 0;"
               }

It is difficult to simulate "lowbat", what do you think?

you are missing one "=" in your if statement:

"getStatusLowBattery": {
     "topic": "ialarm/sensors/state",
     "apply": "if (JSON.parse (message) [7].lowbat == 'true') return 1; else return 0;"
 }

to simulate a lowbat you can try like this:

maxill1 commented 3 years ago

@mrMiimo in riferimento ai nuovi topic menzionati in https://github.com/maxill1/ialarm-mqtt/issues/18#issuecomment-940869992

La versione "dev" che già usi il supporta già.

Se vuoi potresti semplificare la tua configurazione come segue:

"getContactSensorState": {
                   "topic": "ialarm/sensors/zone_8",
                   "apply": "if (JSON.parse(message).status > 1) return 1; else return 0;"

Ovvero impostando ialarm/sensors/zone_8 dove 8 è il numero di zona e togliendo l'indice Array 7 da "apply".

Vedi se ti è più comodo.

mrMiimo commented 3 years ago

stasera faccio un po' di prove e ti faccio sapere. comunque questa versione tcp la trovo molto più reattiva rispetto alla precedente.

mrMiimo commented 3 years ago

stavo facendo un po' di test e sono fermato al primo 🙂 Mi sono accorto che quando viene azionata l'allarme, mqttthing non se ne accorge... è cambiato il "triggered"?

Questa è la mia configurazione Mqttthing:

{
    "accessory": "mqttthing",
    "type": "securitySystem",
    "name": "Allarme",
    "url": "mqtt://XXXXX:1883",
    "username": "XXXXX",
    "password": "XXXXX",
    "topics": {
        "setTargetState": "ialarm/alarm/set",
        "getTargetState": "ialarm/alarm/state",
        "getCurrentState": "ialarm/alarm/state"
    },
    "targetStateValues": [
        "armed_home",
        "armed_away",
        "night_arm",
        "disarmed"
    ],
    "currentStateValues": [
        "armed_home",
        "armed_away",
        "night_arm",
        "disarmed",
        "triggered",
        "trigger"
    ],
    "restrictTargetState": [
        0,
        1,
        3
    ]
}

E questa la configurazione ialarm-mqtt:

    "topics" : {
        "availability": "ialarm/alarm/availability",
        "error" : "ialarm/alarm/error",
    "alarm_qos": 2,
        "alarm" : {
            "state" : "ialarm/alarm/state",
            "command" : "ialarm/alarm/set",
            "event" : "ialarm/alarm/event",
            "discovery" : "ialarm/alarm/discovery",
        "resetCache" : "ialarm/alarm/resetCache",
            "bypass": "ialarm/alarm/zone/${zoneId}/bypass"
        },
        "sensors" : {
            "topicType" : "state",
            "state": "ialarm/sensors/state",
        "sensors_qos": 0,
        "zone": {
                "alarm": "ialarm/sensors/${zoneId}/alarm",
                "active": "ialarm/sensors/${zoneId}/active",
        "lowBattery": "ialarm/sensors/${zoneId}/battery",
                "fault": "ialarm/sensors/${zoneId}/fault"
            }
        }
    },
    "payloads": {
        "alarmAvailable" : "online",
        "alarmNotvailable" : "offline",
        "alarmDecoder": {
            "armAway" : ["armAway", "armedAway", "armed_away", "arm_away", "AA", "AwayArm"],
            "armHome" : ["armHome", "armedHome", "armed_home", "arm_home", "SA", "HomeArm" ,"StayArm", "armStay", "armedStay", "arm_stay", "armed_stay"],
            "disarm" : ["disarm", "disarmed", "D"],
            "cancel" : ["cancel", "canceled", "C"],
            "triggered": [ "trigger",  "triggered", "T"]
        },
        "alarm":{
            "armAway" : "armed_away",
            "armHome" : "armed_home",
            "disarm" : "disarmed",
            "cancel" : "cancel",
            "triggered": "triggered"
        },
        "sensorOn" : "1",
        "sensorOff" : "0"
    },
mrMiimo commented 3 years ago

non riesco a capire cosa manca... secondo me è un topic quando scatta l'allarme... però "triggered" e "trigger" sono configurati

maxill1 commented 3 years ago

dopo lavoro verifico, probabilmente è un bug. è stato cambiato molto dalla versione scraper, serve pazienza.

Per chiarezza, tu che centrale hai? Vorrei censire un po i modelli perchè altri utenti con "casasicura" hanno molti problemi di connessione.

mrMiimo commented 3 years ago

No problem, allora non tocco più e aspetto… La mia è casasicura

maxill1 commented 3 years ago

No problem, allora non tocco più e aspetto… La mia è casasicura

switcha di nuovo il docker-compose su "latest" e buon allarme :smile:

maxill1/ialarm-mqtt:latest
mrMiimo commented 3 years ago

Ah be provo subito. Mi sembra un buon ora per svegliare i vicini 😬

mrMiimo commented 3 years ago

sicuro è stato creato il container nuovo? faccio docker-compose pull però sembra non scarichi niente e sul HUB docker non trovo nessuna immagine nuova...

maxill1 commented 3 years ago

Purtroppo la action non era partita, l'ho fatta parte manualmente.

P.s. lo sai che puoi mutare la sirena per fare le prove, vero? Dalle opzioni metti durata sirena a 0

mrMiimo commented 3 years ago

Perfetto, funziona quando scatta, faccio un po’ di test in questi giorni. Grazie mille!

P.s. lo sai che puoi mutare la sirena per fare le prove, vero? Dalle opzioni metti durata sirena a 0

Sisi lo so, è che cosi non ce gusto 😂… comunque a certe ore l’imposta a 0

mrMiimo commented 3 years ago

you are missing one "=" in your if statement:

"getStatusLowBattery": {
     "topic": "ialarm/sensors/state",
     "apply": "if (JSON.parse (message) [7].lowbat == 'true') return 1; else return 0;"
 }

to simulate a lowbat you can try like this:

  • install MQTT explorer connect to the broker and copy a ialarm/sensors/state payload to a file editor (notepad++, visual studio code, etc)
  • edit one of your sensor setting lowbat : true
  • on ialarm-mqtt increment the status polling to a very large value (60-120 seconds) and restart the container and wait for startup
  • publish the payload you just edited and mqttthing should pickup the values.

Ho fatto delle prove però non sono riuscito a far funzionare fault e lowbat. fault e lowbat vuole solo integer.

Invece "OK," funziona perfettamente con "true/false", è possibile gestire anche gli altri 2 valori?

mrMiimo commented 3 years ago

Ciao Luca, ho visto che hai rilasciato un'aggiornamento. Conviene farlo anche a me? per caso risolve la questione sopra? Grazie mille.

maxill1 commented 3 years ago

puoi anche non aggiornare, risolve altre problematiche.

La tua secondo me è solo di configurazione della funzione "apply". Dalla documentazione di mqttthing per i motion-sensor dice che puoi trattarli come boolean oppure integer usando "integerValue": true.

Ma se togli "integerValue": true da mqttthing, togli "sensorOn" : "1", "sensorOff" : "0" da ialarm-mqtt e torni a usare solo boolean come nell'esempio della documentazione di mqttthing?

{
    "accessory": "mqttthing",
    "type": "motionSensor",
    "name": "Esterno Soggiorno Giardino",
    "url": "mqtt://XXXXXX:1883",
    "username": "XXXXXX",
    "password": "XXXXX",
    "caption": "Zona 33: Sensore Esterno Soggiorno",
    "topics": {
        "getMotionDetected": {
            "topic": "ialarm/sensors/state",
            "apply": "return JSON.parse(message)[32].status > 1;"
        },
        "getStatusActive": {
            "topic": "ialarm/sensors/state",
            "apply": "return JSON.parse(message)[32].ok;"
        },
        "getStatusFault": {
            "topic": "ialarm/sensors/state",
            "apply": "return JSON.parse(message)[32].fault;"
        },
        "getStatusLowBattery": {
            "topic": "ialarm/sensors/state",
            "apply": "return JSON.parse(message)[32].lowbat;"
        }
    }
}
mrMiimo commented 2 years ago

solo adesso sono riuscito a provare. Ho variato la configurazione come mi hai suggerito però non ha cambiato niente... continuo a ricevere il messaggio: [1/13/2022, 4:08:29 PM] [Esterno Soggiorno Giardino] Ignoring invalid value [false] for Status Fault - not an integer

Non saprei cosa altro provare.. :\