Модуль платформы отвечает за взаимодействие с устройствами своего типа.
После старта платформа отправляет запрос на конфигурацию компонентов, как это описано
Полученный ответ фильтруется по принадлежности только к данной платформе. Результат сохраняется.
С ядром системы платформа связана двумя каналами на основе mqtt: команды и состояния.
M
Q
T
T
S
e
r
v
s
e
t
r
a
t
e
s
P
l
a
t
f
o
c
r
o
m
m
m
a
n
d
s
По входному каналу состояний пост-фактум приходят события изменения состояния компонета:
const CHANGE_TOPIC = "chipmunk/event/component/change"
{
"id" :"sensor.bathroom_voltage" ,
"ptf" :"mqtt" ,
"dom" :"sensor" ,
"old" :{
"value" :{
"name" :"value" ,
"type" :"Float" ,
"val" :228
}
},
"new" :{
"value" :{
"name" :"value" ,
"type" :"Float" ,
"val" :229
}
}
}
Обработка состояний:
Э
_
т
_
о
_
┌
│
└
_
─
И
─
┌
│
└
м
_
─
г
─
─
Н
─
о
_
─
н
─
─
а
─
й
_
─
о
─
─
ч
─
_
_
─
р
─
─
а
┬
▽
к
_
│
▽
и
┬
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
└
─
л
─
_
о
_
n
─
р
─
─
─
о
─
_
м
_
o
─
у
─
─
┐
│
┘
_
п
_
─
е
─
─
_
о
_
─
м
─
─
_
н
_
┐
│
┘
─
_
е
_
─
_
н
_
─
_
т
_
─
┌
│
└
_
?
_
─
─
К
─
─
─
о
─
┬
▽
н
─
_
y
─
─
е
─
_
e
─
─
ц
─
_
s
─
┐
│
┘
_
┌
│
└
─
_
─
Б
─
─
_
─
е
─
─
_
┌
│
└
─
р
─
У
е
_
─
_
─
Б
─
─
е
─
с
_
─
_
─
е
─
─
м
─
м
т
_
┌
│
└
─
_
─
р
─
─
─
о
ь
_
─
С
─
─
┌
│
└
─
е
─
─
х
─
е
_
─
л
─
─
─
С
─
─
м
─
─
а
─
г
т
_
─
е
─
─
─
у
─
─
─
─
р
─
о
а
_
─
д
─
─
─
п
─
─
к
─
─
а
─
_
к
_
─
у
─
─
─
е
┬
▽
о
┬
│
│
┴
к
┬
▽
к
а
_
│
▽
ю
┬
│
│
│
│
│
│
│
│
└
─
─
р
─
─
м
─
◁
─
т
─
_
о
я
_
n
─
щ
─
─
─
─
!
─
─
п
─
─
─
е
─
_
м
?
_
o
─
а
─
─
─
┐
│
┘
─
о
─
─
─
р
─
_
п
_
─
я
─
─
─
─
н
─
─
─
и
─
_
о
_
─
!
─
─
─
─
е
─
─
─
с
─
_
н
_
┐
│
┘
─
─
─
н
─
─
─
т
─
_
е
_
─
─
─
т
─
─
─
и
─
_
н
_
─
─
┐
│
┘
─
─
к
─
_
т
_
─
Е
х
_
─
─
─
у
─
_
а
_
─
с
а
_
─
─
┐
│
┘
─
т
р
_
─
─
─
ь
а
_
─
─
_
y
─
к
_
─
─
_
e
─
е
т
_
─
─
_
s
─
_
щ
е
_
─
─
_
┌
│
│
└
┬
▽
е
р
_
│
┘
─
_
─
Б
к
─
─
_
и
_
n
─
_
─
е
о
─
З
_
─
_
с
_
o
─
_
─
р
м
─
н
_
─
_
т
_
─
_
─
е
п
─
а
_
─
_
и
_
─
_
─
м
о
─
ч
_
┌
│
└
─
_
к
_
─
┌
│
└
─
н
─
е
_
─
Н
─
─
_
и
_
─
─
Н
─
─
х
е
─
н
_
─
у
─
─
_
?
_
─
─
е
─
─
а
н
─
и
_
─
─
─
─
─
п
─
─
р
т
─
е
_
─
и
─
─
─
─
л
─
─
а
а
─
_
_
─
─
─
_
y
─
─
о
┬
▽
к
┬
▽
и
_
│
▽
л
┬
┴
_
e
─
─
х
─
─
т
─
_
з
_
n
─
а
─
─
_
s
─
─
о
─
─
е
─
_
м
_
o
─
д
─
─
_
─
─
!
─
─
р
─
_
е
_
─
н
─
─
_
─
┐
│
┘
─
и
─
_
н
_
─
о
─
─
_
─
─
с
─
_
и
_
┐
│
┘
─
_
─
─
т
─
_
л
_
─
_
─
─
и
─
_
о
_
─
_
─
─
к
─
_
с
_
─
_
─
─
у
─
_
ь
_
─
_
─
┐
│
│
┘
_
?
_
─
_
─
─
_
─
─
_
─
_
y
─
_
─
_
e
─
_
─
_
s
─
_
─
_
─
_
─
_
х
─
_
─
_
а
─
_
─
_
р
─
_
─
_
М
а
─
_
─
_
е
к
─
_
─
_
н
т
─
_
─
_
я
е
─
_
─
┌
│
└
е
р
─
_
─
─
К
─
м
и
─
_
─
─
л
─
с
─
_
─
─
а
─
-
з
т
─
_
─
─
с
┬
▽
н
и
┘
_
─
─
с
─
-
а
к
_
─
─
!
─
-
ч
и
_
─
┐
│
┘
-
е
_
─
-
н
н
_
─
-
и
а
_
─
-
е
_
─
-
н
_
─
-
о
_
─
-
в
_
─
о
_
─
е
_
─
_
╮
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
│
По входному каналу команд принимаются команды по управлению собственными компонентами.
const COMMAND_TOPIC = "chipmunk/platform/cmd"
type Command struct {
Domain string `json:"dom"`
Action string `json:"act"`
ComponentId string `json:"cid"`
Arg string `json:"arg,omitempty"`
}
Поле
Назначение
Формат
dom
тип устройства
Domain
act
команда
строка
cid
ID компонента
строка
arg
опциональный аргумент
строка
Типы устройств:
DomainSwitch Domain = iota
DomainTimer
DomainBinarySensor
DomainSensor
DomainLight
DomainWeather
DomainScript
DomainCountdown
DomainAlarm
DomainTelegram
DomainZone
DomainTicker
Команда переключить выключатель cabinet_tablelamp выглядит так:
{
"dom" :"switch" ,
"act" :"toggle" ,
"cid" :"switch.cabinet_tablelamp"
}
Обработка команд
У
к
_
о
_
м
м
_
е
а
_
н
н
_
я
д
_
ы
_
е
_
┌
│
└
с
д
_
─
И
─
┌
│
└
т
л
_
─
г
─
─
Н
─
ь
я
_
─
н
─
─
а
─
_
─
о
─
─
ч
─
_
о
т
_
─
р
─
─
а
┬
▽
б
а
_
│
▽
и
─
─
л
─
_
р
к
_
n
─
р
─
─
о
─
_
а
о
_
o
─
у
─
┐
│
┘
_
б
г
_
─
е
─
_
о
о
_
─
м
─
_
т
_
┐
│
┘
_
ч
д
_
_
и
о
_
_
к
м
_
_
е
_
_
т
н
_
_
а
а
_
_
к
?
_
_
о
_
_
й
_
_
y
_
e
_
s
Э
_
т
_
о
_
┌
│
└
_
─
И
─
м
_
─
г
─
о
_
─
н
─
й
_
─
о
─
_
─
р
─
к
_
│
▽
и
─
о
_
n
─
р
─
м
_
o
─
у
─
п
_
─
е
─
о
_
─
м
─
н
_
┐
│
┘
е
_
н
_
т
_
?
_
_
y
_
e
_
s
_
┌
│
└
_
─
В
─
_
─
ы
─
┌
│
└
─
п
─
─
Б
─
─
о
─
─
е
─
─
л
─
─
р
─
─
н
─
─
е
─
─
и
─
─
м
─
─
т
─
┌
│
└
─
─
─
ь
─
─
К
─
─
к
─
─
─
─
о
─
─
о
┬
│
▽
о
┬
│
▽
н
─
─
м
─
─
б
─
─
е
─
─
п
─
─
р
─
─
ц
─
─
о
─
─
а
─
┐
│
┘
─
н
─
─
б
─
─
е
─
─
о
─
─
н
─
─
т
─
─
т
─
─
ч
─
┐
│
┘
─
и
─
─
к
─
┐
│
┘
Специфика работы конкретного зависит от платформы и домена. Для виртуальной платформы , которая не связана с внешним миром, обрабочик
может просто поменять состояние компонента и, если надо, отправить событие об изменении в топик состояний. MQTT платформа отправит на сервер команду физическому устройству. А внутреннее изменение произойдет, когда устройство ее выполнит и опубликует на MQTT свое новое состояние и платформа получит подтверждение.
Особенности работы каждой платформы sic! описаны отдельно.