LightHub 4.6.0
Open-source smart home controller firmware
Loading...
Searching...
No Matches
item.h
Go to the documentation of this file.
1/* Copyright © 2017-2025 Andrey Klimov. All rights reserved.
2
3Licensed under the Apache License, Version 2.0 (the "License");
4you may not use this file except in compliance with the License.
5You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9Unless required by applicable law or agreed to in writing, software
10distributed under the License is distributed on an "AS IS" BASIS,
11WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12See the License for the specific language governing permissions and
13limitations under the License.
14
15Homepage: http://lazyhome.ru
16GIT: https://github.com/anklimov/lighthub
17e-mail anklimov@gmail.com
18
19*/
36#pragma once
37#include "options.h"
38#include "abstractout.h"
39#include "itemCmd.h"
40
41
46#define S_NOTFOUND 0
47#define S_CMD 1
48#define S_SET 2
49#define S_VAL 3
50#define S_DELAYED 4
51#define S_HSV 5
52#define S_RGB 6
53#define S_FAN 7
54#define S_MODE 8
55#define S_CTRL 9
56#define S_HUE 10
57#define S_SAT 11
58#define S_TEMP 12
59#define S_RAW 13
60
78typedef char suffixstr[5];
79const suffixstr suffix_P[] PROGMEM =
80{"","cmd","set","val","del","HSV","RGB","fan","mode","ctrl","hue","sat","temp","raw"};
81#define suffixNum sizeof(suffix_P)/sizeof(suffixstr)
82
83#define S_ADDITIONAL 13
84
115#define CH_DIMMER 0 //DMX 1-4 ch
116#define CH_RGBW 1 //DMX 4 ch
117#define CH_RGB 2 //DMX 3 ch
118#define CH_PWM 3 //PWM output directly to PIN 1-4 CH
119#define CH_MODBUS 4 //Modbus AC Dimmer
120#define CH_THERMO 5 //Simple ON/OFF thermostat
121#define CH_RELAY 6 //ON_OFF relay output
122#define CH_GROUP 7 //Group pseudochannel
123#define CH_VCTEMP 8 //Vacom PID regulator
124#define CH_VC 9 //Vacom modbus motor regulator
125#define CH_AC 10 //AC Haier
126#define CH_SPILED 11
127#define CH_MOTOR 12
128#define CH_PID 13
129#define CH_MBUS 14
130#define CH_UARTBRIDGE 15
131#define CH_RELAYX 16
132#define CH_RGBWW 17
133#define CH_MULTIVENT 18
134#define CH_ELEVATOR 19
135#define CH_COUNTER 20
136#define CH_HUMIDIFIER 21
137#define CH_MERCURY 22
138#define CH_SPRINKLER 23
139#define CH_MAX 23
140
148#define POLLING_SLOW 1
149#define POLLING_FAST 2
150#define POLLING_INT 3
151#define POLLING_1S 4
152
153//CTRL Execution flags
161#define CTRL_DISABLE_RECURSION 1
162#define CTRL_DISABLE_NON_GRP 2
163#define CTRL_SCHEDULED_CALL_RECURSION (CTRL_DISABLE_RECURSION | CTRL_DISABLE_NON_GRP)
164
174#define I_TYPE 0 //Type of item
175#define I_ARG 1 //Chanel-type depended argument or array of arguments (pin, address etc)
176#define I_VAL 2 //Latest preset (int or array of presets)
177#define I_CMD 3 //Latest CMD received
178#define I_EXT 4 //Chanell-depended extension - array
179#define I_TIMESTAMP 5
180
185#define MODBUS_CMD_ARG_ADDR 0
186#define MODBUS_CMD_ARG_REG 1
187#define MODBUS_CMD_ARG_MASK 2
188#define MODBUS_CMD_ARG_MAX_SCALE 3
189#define MODBUS_CMD_ARG_REG_TYPE 4
190
192#define MODBUS_COIL_REG_TYPE 0
193#define MODBUS_DISCRETE_REG_TYPE 1
194#define MODBUS_HOLDING_REG_TYPE 2
195#define MODBUS_INPUT_REG_TYPE 3
196
197#include "aJSON.h"
198
200extern aJsonObject *items;
202extern short thermoSetCurTemp(char *name, float t);
203
209int txt2cmd (char * payload);
215int txt2subItem(char *payload);
216
231class Item
232{
233 public:
237 uint8_t itemType;
240
247 Item(char * name, aJsonObject *_items = items);
252 Item(aJsonObject * obj, aJsonObject *_items = items);
258 Item(uint16_t num, uint8_t subItem, aJsonObject *_items = items);
260 ~Item();
261
263 boolean isValid ();
268 boolean Setup();
270 void Stop();
271 //int Ctrl(short cmd, short n=0, int * Parameters=NULL, int suffixCode=0, char* subItem=NULL);
281 int Ctrl(itemCmd cmd, char* subItem=NULL, uint8_t flags = 0, bool authorized=false);
287 int Ctrl(char * payload, char * subItem=NULL, int remoteID = 0);
293 int remoteCtrl(itemCmd cmd, int remoteID, char* subItem=NULL, char * authToken=NULL);
295 int getArg(short n=0);
297 float getFloatArg(short n=0);
299 short getArgCount();
300 //int getVal(short n); //From VAL array. Negative if no array
302 long int getVal(); //From int val OR array
304 uint8_t getSubtype();
306 uint8_t getCmd();
308 long int getExt(); //From int val OR array
310 void setExt(long int par);
316 void setCmd(uint8_t cmdValue);
318 uint32_t getFlag (uint32_t flag=FLAG_MASK);
320 void setFlag (uint32_t flag);
322 void clearFlag (uint32_t flag);
324 void setVal(long int par);
326 void setFloatVal(float par);
328 void setSubtype(uint8_t par);
335 int Poll(int cause);
342 int SendStatus(long sendFlags, char * subItem=NULL);
344 int SendStatusImmediate(itemCmd st, long sendFlags, char * subItem=NULL, bool tetain = true);
346 int isActive();
348 int getChanType();
350 inline int On (){return Ctrl(itemCmd(ST_VOID,CMD_ON));};
352 inline int Off(){return Ctrl(itemCmd(ST_VOID,CMD_OFF));};
354 inline int Toggle(){return Ctrl(itemCmd(ST_VOID,CMD_TOGGLE));};
359 int scheduleCommand(itemCmd cmd, bool authorized);
365 int scheduleOppositeCommand(itemCmd cmd,short isActiveNow,bool authorized);
367 int isScheduled();
369 char * getSubItemStrById(uint8_t subItem);
371 uint8_t getSubitemId(char * subItem);
372
373 protected:
379 bool digGroup (aJsonObject *itemArr, itemCmd *cmd = NULL, char* subItem = NULL, bool authorized = false, uint8_t ctrlFlags = 0);
381 long int limitSetValue();
383 int VacomSetFan (itemCmd st);
385 int VacomSetHeat(itemCmd st);
387 int modbusDimmerSet(itemCmd st);
389 int modbusDimmerSet(int addr, uint16_t _reg, int _regType, int _mask, uint16_t value);
391 void mb_fail(int result=0);
393 void Parse();
395 int checkModbusDimmer();
397 int checkModbusDimmer(int data);
399 int checkRetry();
401 void sendDelayedStatus();
403 int checkFM();
406};
407
416 public:
417 driverFactory(){memset(drivers,0,sizeof(drivers));};
419 Item * getItem(Item * item);
421 abstractOut * getDriver(Item * item);
423 abstractOut * findDriver(Item * item);
425 void freeDriver(Item * item);
427 abstractOut * newDriver(uint8_t itemType);
428 private:
430 abstractOut * drivers[CH_MAX+1];
431};
432
439typedef union
440{
441struct
442 {
443 int16_t tempX100;
444 uint16_t timestamp16;
445 };
446int32_t asint;
A single LightHub item (virtual channel).
Definition item.h:232
uint8_t getSubitemId(char *subItem)
Definition item.cpp:390
int checkRetry()
Definition item.cpp:2234
uint32_t getFlag(uint32_t flag=FLAG_MASK)
Definition item.cpp:473
int getArg(short n=0)
Definition item.cpp:507
Item(char *name, aJsonObject *_items=items)
Create an item by name from the items object.
Definition item.cpp:310
int VacomSetFan(itemCmd st)
Definition item.cpp:2356
void setCmd(uint8_t cmdValue)
Definition item.cpp:463
void mb_fail(int result=0)
Definition item.cpp:2216
void setFlag(uint32_t flag)
Definition item.cpp:483
uint8_t getCmd()
Definition item.cpp:455
int isScheduled()
Definition item.cpp:938
int Ctrl(itemCmd cmd, char *subItem=NULL, uint8_t flags=0, bool authorized=false)
Main control entry point: execute a command/value on this item.
Definition item.cpp:1040
aJsonObject * itemExt
Definition item.h:235
boolean isValid()
Definition item.cpp:668
int scheduleCommand(itemCmd cmd, bool authorized)
Definition item.cpp:1003
bool digGroup(aJsonObject *itemArr, itemCmd *cmd=NULL, char *subItem=NULL, bool authorized=false, uint8_t ctrlFlags=0)
Definition item.cpp:892
void setSubtype(uint8_t par)
Definition item.cpp:608
int isActive()
Definition item.cpp:1787
int defaultSuffixCode
Definition item.h:405
void setFloatVal(float par)
Definition item.cpp:599
int Toggle()
Definition item.h:354
int modbusDimmerSet(itemCmd st)
Definition item.cpp:2325
char * getSubItemStrById(uint8_t subItem)
Definition item.cpp:371
int remoteCtrl(itemCmd cmd, int remoteID, char *subItem=NULL, char *authToken=NULL)
Definition item.cpp:869
aJsonObject * itemArr
Definition item.h:235
int SendStatus(long sendFlags, char *subItem=NULL)
Definition item.cpp:1943
int Off()
Definition item.h:352
int checkModbusDimmer()
Definition item.cpp:2639
float getFloatArg(short n=0)
Definition item.cpp:518
abstractOut * driver
Linked output driver instance (shared per channel type) or NULL.
Definition item.h:239
short getArgCount()
Definition item.cpp:537
aJsonObject * rootItems
Pointers into the items JSON tree (root object, item array, its arg/val/ext elements).
Definition item.h:235
long int limitSetValue()
Definition item.cpp:704
char defaultSubItem[16]
Definition item.h:404
int VacomSetHeat(itemCmd st)
Definition item.cpp:2414
int Poll(int cause)
Definition item.cpp:1862
aJsonObject * itemVal
Definition item.h:235
int checkFM()
Definition item.cpp:2523
int SendStatusImmediate(itemCmd st, long sendFlags, char *subItem=NULL, bool tetain=true)
Definition item.cpp:1959
long int getExt()
Definition item.cpp:614
aJsonObject * itemArg
Definition item.h:235
long int getVal()
Definition item.cpp:557
void Parse()
Definition item.cpp:159
void Stop()
Definition item.cpp:293
int scheduleOppositeCommand(itemCmd cmd, short isActiveNow, bool authorized)
Definition item.cpp:948
int On()
Definition item.h:350
uint8_t getSubtype()
Definition item.cpp:568
chPersistent * getPersistent()
Definition item.cpp:641
void setVal(long int par)
Definition item.cpp:590
void setExt(long int par)
Definition item.cpp:625
uint8_t itemType
Channel type (CH_*) resolved from I_TYPE.
Definition item.h:237
boolean Setup()
Definition item.cpp:278
chPersistent * setPersistent(chPersistent *par)
Definition item.cpp:648
int getChanType()
Definition item.cpp:2208
void sendDelayedStatus()
Definition item.cpp:1932
void clearFlag(uint32_t flag)
Definition item.cpp:495
Base class of output driver modules (one per channel type).
Definition abstractout.h:19
Placeholder for driver-persistent data attached to an item (I_EXT field).
Definition abstractout.h:8
Item * getItem(Item *item)
Definition item.cpp:2745
abstractOut * getDriver(Item *item)
Definition item.cpp:2782
driverFactory()
Definition item.h:417
abstractOut * newDriver(uint8_t itemType)
Definition item.cpp:2802
void freeDriver(Item *item)
Definition item.cpp:2768
abstractOut * findDriver(Item *item)
Definition item.cpp:2752
Command + value container passed between items, drivers and MQTT.
Definition itemCmd.h:306
itemCmd(uint8_t _type=ST_VOID, uint8_t _code=CMD_VOID)
Constructor with definition of type and command.
Definition itemCmd.cpp:61
aJsonObject * items
Definition main.cpp:120
int txt2subItem(char *payload)
Definition item.cpp:119
aJsonObject * items
Definition main.cpp:120
int txt2cmd(char *payload)
Definition itemCmd.cpp:19
#define CH_MAX
Definition item.h:139
short thermoSetCurTemp(char *name, float t)
const suffixstr suffix_P[] PROGMEM
Definition item.h:79
char suffixstr[5]
Definition item.h:78
#define CMD_TOGGLE
Definition itemCmd.h:107
#define CMD_OFF
Definition itemCmd.h:105
#define FLAG_MASK
High two bytes of the packed I_CMD int - state flags (FLAG_*).
Definition itemCmd.h:138
#define ST_VOID
Definition of all possible types of argument, contained in class.
Definition itemCmd.h:212
#define CMD_ON
Definition of Commands.
Definition itemCmd.h:104
CH_THERMO runtime state packed into one int32 (stored in I_EXT).
Definition item.h:440
int32_t asint
Definition item.h:446