1 #pragma once
2 
3 #include "../DomoticzHardware.h"
4 #include "PhilipsHueSensors.h"
5 
6 namespace Json
7 {
8 	class Value;
9 };
10 
11 class CPhilipsHue : public CDomoticzHardwareBase
12 {
13 	enum _eHueLightType
14 	{
15 		HLTYPE_NORMAL,
16 		HLTYPE_DIM,
17 		HLTYPE_RGB_W,
18 		HLTYPE_SCENE,
19 		HLTYPE_CW_WW,
20 		HLTYPE_RGB_CW_WW
21 	};
22 	enum _eHueColorMode
23 	{
24 		HLMODE_NONE,
25 		HLMODE_HS,
26 		HLMODE_CT,
27 		HLMODE_XY
28 	};
29 	struct _tHueLightState
30 	{
31 		bool on;
32 		_eHueColorMode mode;
33 		int level;
34 		int hue;
35 		int sat;
36 		int ct;
37 		double x;
38 		double y;
39 	};
40 	struct _tHueGroup
41 	{
42 		_tHueLightState gstate;
43 		std::vector<int> lights;
44 	};
45 	struct _tHueScene
46 	{
47 		std::string id;
48 		std::string name;
49 		std::string lastupdated;
50 	};
51 
52 public:
53 	CPhilipsHue(const int ID, const std::string &IPAddress, const unsigned short Port, const std::string &Username, const int poll, const int Options);
54 	~CPhilipsHue(void);
55 	bool WriteToHardware(const char *pdata, const unsigned char length) override;
56 	static std::string RegisterUser(const std::string &IPAddress, const unsigned short Port, const std::string &username);
57 private:
58 	void Init();
59 	bool StartHardware() override;
60 	bool StopHardware() override;
61 	void Do_Work();
62 	bool GetStates();
63 	bool GetLights(const Json::Value &root);
64 	bool GetGroups(const Json::Value &root);
65 	bool GetScenes(const Json::Value &root);
66 	bool GetSensors(const Json::Value &root);
67 	void InsertUpdateLamp(const int NodeID, const _eHueLightType LType, const _tHueLightState tstate, const std::string& Name, const std::string& Options, const std::string& modelid, const bool AddMissingDevice);
68 	bool InsertUpdateSelectorSwitch(const int NodeID, const uint8_t Unitcode, const uint8_t selectorLevel, const std::string& Name, const uint8_t BatteryLevel);
69 	void InsertUpdateSwitch(const int NodeID, const uint8_t Unitcode, const _eSwitchType SType, const bool bIsOn, const std::string &Name, const uint8_t BatteryLevel);
70 	void SetSwitchOptions(const int NodeID, const uint8_t Unitcode, const std::map<std::string, std::string> options);
71 	bool SwitchLight(const int nodeID, const std::string &LCmd, const int svalue, const int svalue2 = 0, const int svalue3 = 0);
72 	static void LightStateFromJSON(const Json::Value &lightstate, _tHueLightState &tlight, _eHueLightType &LType);
73 	static void RgbFromXY(const double x, const double y, const double bri, const std::string &modelid, uint8_t &r8, uint8_t &g8, uint8_t &b8);
74 	static bool StatesSimilar(const _tHueLightState &s1, const _tHueLightState &s2);
75 private:
76 	int m_poll_interval;
77 	bool m_add_groups;
78 	bool m_add_scenes;
79 	std::string m_IPAddress;
80 	unsigned short m_Port;
81 	std::string m_UserName;
82 	std::shared_ptr<std::thread> m_thread;
83 	std::map<int, _tHueLightState> m_lights;
84 	std::map<int, _tHueGroup> m_groups;
85 	std::map<std::string, _tHueScene> m_scenes;
86 	std::map<int, CPHSensor> m_sensors;
87 };
88 
89