bmsd/co2meters.c

changeset 678
14322825cb3d
parent 677
6e82fece1f8f
child 680
0bb48333d133
equal deleted inserted replaced
677:6e82fece1f8f 678:14322825cb3d
38 extern MYSQL_RES *res_set; 38 extern MYSQL_RES *res_set;
39 extern MYSQL_ROW row; 39 extern MYSQL_ROW row;
40 40
41 41
42 42
43 void co2meter_set(char *edge_node, char *alias, char *payload) 43 void co2meter_ws_send(sys_co2meter_list *co2meter)
44 { 44 {
45 struct json_object *jobj, *val, *sensor; 45 char *msg = NULL, buf[65];
46 sys_co2meter_list *co2meter, *tmpp;
47 bool new_co2meter = true;
48 char *msg = NULL, buf[65];
49
50 // fprintf(stdout, "co2meter_set: %s/%s %s\n", edge_node, alias, payload);
51
52 /*
53 * Search co2meter record in the memory array and use it if found.
54 */
55 if (co2meters) {
56 for (tmpp = co2meters; tmpp; tmpp = tmpp->next) {
57 if ((strcmp(tmpp->alias, alias) == 0) && (strcmp(tmpp->node, edge_node) == 0)) {
58 new_co2meter = false;
59 co2meter = tmpp;
60 break;
61 }
62 }
63 }
64
65 // printf("new_co2meter %s\n", new_co2meter ? "true":"false");
66
67 /*
68 * Allocate new co2meter if not yet known.
69 */
70 if (new_co2meter) {
71 co2meter = (sys_co2meter_list *)malloc(sizeof(sys_co2meter_list));
72 memset(co2meter, 0, sizeof(sys_co2meter_list));
73 co2meter->alias = xstrcpy(alias);
74 co2meter->node = xstrcpy(edge_node);
75 co2meter->mode = xstrcpy((char *)"OFF");
76 }
77
78 if (! co2meter->online) {
79 co2meter->online = true;
80 syslog(LOG_NOTICE, "Online co2meter %s/%s mode %s", edge_node, alias, co2meter->mode);
81 }
82
83 /*
84 * Process the JSON formatted payload.
85 * Update only the fields that are found in the payload.
86 */
87 jobj = json_tokener_parse(payload);
88
89 if (json_object_object_get_ex(jobj, "uuid", &val)) {
90 if (co2meter->uuid)
91 free(co2meter->uuid);
92 co2meter->uuid = xstrcpy((char *)json_object_get_string(val));
93 }
94 if (json_object_object_get_ex(jobj, "mode", &val)) {
95 if (co2meter->mode) {
96 if (strcmp(co2meter->mode, (char *)json_object_get_string(val))) {
97 syslog(LOG_NOTICE, "Change mode co2meter %s/%s: %s to %s", edge_node, alias, co2meter->mode, (char *)json_object_get_string(val));
98 }
99 free(co2meter->mode);
100 }
101 co2meter->mode = xstrcpy((char *)json_object_get_string(val));
102 }
103 if (json_object_object_get_ex(jobj, "alarm", &val)) {
104 co2meter->alarm = json_object_get_int(val);
105 }
106 if (json_object_object_get_ex(jobj, "temperature", &sensor)) {
107 if (json_object_object_get_ex(sensor, "address", &val)) {
108 if (co2meter->temperature_address)
109 free(co2meter->temperature_address);
110 co2meter->temperature_address = xstrcpy((char *)json_object_get_string(val));
111 }
112 if (json_object_object_get_ex(sensor, "state", &val)) {
113 if (co2meter->temperature_state)
114 free(co2meter->temperature_state);
115 co2meter->temperature_state = xstrcpy((char *)json_object_get_string(val));
116 }
117 if (json_object_object_get_ex(sensor, "temperature", &val)) {
118 co2meter->temperature = json_object_get_double(val);
119 }
120 }
121 if (json_object_object_get_ex(jobj, "pressure", &sensor)) {
122 if (json_object_object_get_ex(sensor, "state", &val)) {
123 if (co2meter->pressure_state)
124 free(co2meter->pressure_state);
125 co2meter->pressure_state = xstrcpy((char *)json_object_get_string(val));
126 }
127 if (json_object_object_get_ex(sensor, "channel", &val)) {
128 co2meter->pressure_channel = json_object_get_int(val);
129 }
130 if (json_object_object_get_ex(sensor, "voltage", &val)) {
131 co2meter->pressure_voltage = json_object_get_double(val);
132 }
133 if (json_object_object_get_ex(sensor, "zero", &val)) {
134 co2meter->pressure_zero = json_object_get_double(val);
135 }
136 if (json_object_object_get_ex(sensor, "bar", &val)) {
137 co2meter->pressure_bar = json_object_get_double(val);
138 }
139 }
140 json_object_put(jobj);
141 46
142 msg = xstrcpy((char *)"{\"device\":\"co2meters\",\"node\":\""); 47 msg = xstrcpy((char *)"{\"device\":\"co2meters\",\"node\":\"");
143 msg = xstrcat(msg, edge_node); 48 msg = xstrcat(msg, co2meter->node);
144 msg = xstrcat(msg, (char *)"\",\"unit\":\""); 49 msg = xstrcat(msg, (char *)"\",\"unit\":\"");
145 msg = xstrcat(msg, alias); 50 msg = xstrcat(msg, co2meter->alias);
146 msg = xstrcat(msg, (char *)"\",\"online\":"); 51 msg = xstrcat(msg, (char *)"\",\"online\":");
147 msg = xstrcat(msg, co2meter->online ? (char *)"1":(char *)"0"); 52 msg = xstrcat(msg, co2meter->online ? (char *)"1":(char *)"0");
148 msg = xstrcat(msg, (char *)",\"mode\":\""); 53 msg = xstrcat(msg, (char *)",\"mode\":\"");
149 msg = xstrcat(msg, co2meter->mode); 54 msg = xstrcat(msg, co2meter->mode);
55 msg = xstrcat(msg, (char *)"\",\"beercode\":\"");
56 msg = xstrcat(msg, co2meter->beercode);
57 msg = xstrcat(msg, (char *)"\",\"beername\":\"");
58 msg = xstrcat(msg, co2meter->beername);
150 msg = xstrcat(msg, (char *)"\",\"temperature\":"); 59 msg = xstrcat(msg, (char *)"\",\"temperature\":");
151 snprintf(buf, 64, "%.3f", co2meter->temperature); 60 snprintf(buf, 64, "%.3f", co2meter->temperature);
152 msg = xstrcat(msg, buf); 61 msg = xstrcat(msg, buf);
153 msg = xstrcat(msg, (char *)",\"pressure_channel\":"); 62 msg = xstrcat(msg, (char *)",\"pressure_channel\":");
154 snprintf(buf, 64, "%d", co2meter->pressure_channel); 63 snprintf(buf, 64, "%d", co2meter->pressure_channel);
167 msg = xstrcat(msg, buf); 76 msg = xstrcat(msg, buf);
168 msg = xstrcat(msg, (char *)"}"); 77 msg = xstrcat(msg, (char *)"}");
169 ws_broadcast(msg); 78 ws_broadcast(msg);
170 free(msg); 79 free(msg);
171 msg = NULL; 80 msg = NULL;
81
82 }
83
84
85
86 void co2meter_ws_receive(char *payload)
87 {
88 struct json_object *jobj, *val;
89 sys_co2meter_list *tmpp;
90 char *node = NULL, *alias = NULL, *beeruuid = NULL, *beercode = NULL, *beername = NULL;
91 char query[512], *end;
92 MYSQL *con2 = NULL;
93
94 syslog(LOG_NOTICE, "co2meter_ws_receive(%s)", payload);
95
96 /*
97 * Process the JSON formatted payload.
98 */
99 jobj = json_tokener_parse(payload);
100 if (json_object_object_get_ex(jobj, "node", &val))
101 node = xstrcpy((char *)json_object_get_string(val));
102 if (json_object_object_get_ex(jobj, "unit", &val))
103 alias = xstrcpy((char *)json_object_get_string(val));
104 if (json_object_object_get_ex(jobj, "beeruuid", &val))
105 beeruuid = xstrcpy((char *)json_object_get_string(val));
106 if (json_object_object_get_ex(jobj, "beercode", &val))
107 beercode = xstrcpy((char *)json_object_get_string(val));
108 if (json_object_object_get_ex(jobj, "beername", &val))
109 beername = xstrcpy((char *)json_object_get_string(val));
110 json_object_put(jobj);
111
112 /*
113 * Search co2meter record in the memory array and use it if found.
114 */
115 if (co2meters) {
116 for (tmpp = co2meters; tmpp; tmpp = tmpp->next) {
117 if ((strcmp(tmpp->alias, alias) == 0) && (strcmp(tmpp->node, node) == 0)) {
118 if (beeruuid && beercode && beername) {
119 con2 = mysql_init(NULL);
120 if (con2 == NULL) {
121 syslog(LOG_NOTICE, "MySQL: mysql_init() failed");
122 } else {
123 if (mysql_real_connect(con2, Config.mysql_host, Config.mysql_user, Config.mysql_pass, Config.mysql_database, Config.mysql_port, NULL, 0) == NULL) {
124 syslog(LOG_NOTICE, "MySQL: mysql_real_connect() %s", mysql_error(con2));
125 } else {
126 end = stpcpy(query, "UPDATE mon_co2meters SET beeruuid='");
127 end += mysql_real_escape_string(con2, end, beeruuid, strlen(beeruuid));
128 end = stpcpy(end, "', beercode='");
129 end += mysql_real_escape_string(con2, end, beercode, strlen(beercode));
130 end = stpcpy(end, "', beername='");
131 end += mysql_real_escape_string(con2, end, beername, strlen(beername));
132 end = stpcpy(end, "' WHERE node='");
133 end += mysql_real_escape_string(con2, end, node, strlen(node));
134 end = stpcpy(end, "' AND alias='");
135 end += mysql_real_escape_string(con2, end, alias, strlen(alias));
136 end = stpcpy(end, "'");
137
138 if (mysql_real_query(con2, query, (unsigned int) (end - query))) {
139 syslog(LOG_NOTICE, "MySQL: `%s' error %u (%s))", query, mysql_errno(con2), mysql_error(con2));
140 } else {
141 /* Database updated, now update internal memory */
142 //syslog(LOG_NOTICE, "MySQL: `%s' Ok", query);
143 if (tmpp->beercode)
144 free(tmpp->beercode);
145 tmpp->beercode = xstrcpy(beercode);
146 if (tmpp->beername)
147 free(tmpp->beername);
148 tmpp->beername = xstrcpy(beername);
149 if (tmpp->beeruuid)
150 free(tmpp->beeruuid);
151 tmpp->beeruuid = xstrcpy(beeruuid);
152 /* Report new state to the client */
153 co2meter_ws_send(tmpp);
154 syslog(LOG_NOTICE, "Set co2meter %s/%s new beer %s %s", node, alias, beercode, beername);
155 }
156 mysql_close(con2);
157 }
158 }
159 }
160 break;
161 }
162 }
163 }
164
165 if (node)
166 free(node);
167 if (alias)
168 free(alias);
169 if (beeruuid)
170 free(beeruuid);
171 if (beercode)
172 free(beercode);
173 if (beername)
174 free(beername);
175 }
176
177
178
179 void co2meter_set(char *edge_node, char *alias, char *payload)
180 {
181 struct json_object *jobj, *val, *sensor;
182 sys_co2meter_list *co2meter, *tmpp;
183 bool new_co2meter = true;
184
185 // fprintf(stdout, "co2meter_set: %s/%s %s\n", edge_node, alias, payload);
186
187 /*
188 * Search co2meter record in the memory array and use it if found.
189 */
190 if (co2meters) {
191 for (tmpp = co2meters; tmpp; tmpp = tmpp->next) {
192 if ((strcmp(tmpp->alias, alias) == 0) && (strcmp(tmpp->node, edge_node) == 0)) {
193 new_co2meter = false;
194 co2meter = tmpp;
195 break;
196 }
197 }
198 }
199
200 // printf("new_co2meter %s\n", new_co2meter ? "true":"false");
201
202 /*
203 * Allocate new co2meter if not yet known.
204 */
205 if (new_co2meter) {
206 co2meter = (sys_co2meter_list *)malloc(sizeof(sys_co2meter_list));
207 memset(co2meter, 0, sizeof(sys_co2meter_list));
208 co2meter->alias = xstrcpy(alias);
209 co2meter->node = xstrcpy(edge_node);
210 co2meter->mode = xstrcpy((char *)"OFF");
211 }
212
213 if (! co2meter->online) {
214 co2meter->online = true;
215 syslog(LOG_NOTICE, "Online co2meter %s/%s mode %s", edge_node, alias, co2meter->mode);
216 }
217
218 /*
219 * Process the JSON formatted payload.
220 * Update only the fields that are found in the payload.
221 */
222 jobj = json_tokener_parse(payload);
223
224 if (json_object_object_get_ex(jobj, "uuid", &val)) {
225 if (co2meter->uuid)
226 free(co2meter->uuid);
227 co2meter->uuid = xstrcpy((char *)json_object_get_string(val));
228 }
229 if (json_object_object_get_ex(jobj, "mode", &val)) {
230 if (co2meter->mode) {
231 if (strcmp(co2meter->mode, (char *)json_object_get_string(val))) {
232 syslog(LOG_NOTICE, "Change mode co2meter %s/%s: %s to %s", edge_node, alias, co2meter->mode, (char *)json_object_get_string(val));
233 }
234 free(co2meter->mode);
235 }
236 co2meter->mode = xstrcpy((char *)json_object_get_string(val));
237 }
238 if (json_object_object_get_ex(jobj, "alarm", &val)) {
239 co2meter->alarm = json_object_get_int(val);
240 }
241 if (json_object_object_get_ex(jobj, "temperature", &sensor)) {
242 if (json_object_object_get_ex(sensor, "address", &val)) {
243 if (co2meter->temperature_address)
244 free(co2meter->temperature_address);
245 co2meter->temperature_address = xstrcpy((char *)json_object_get_string(val));
246 }
247 if (json_object_object_get_ex(sensor, "state", &val)) {
248 if (co2meter->temperature_state)
249 free(co2meter->temperature_state);
250 co2meter->temperature_state = xstrcpy((char *)json_object_get_string(val));
251 }
252 if (json_object_object_get_ex(sensor, "temperature", &val)) {
253 co2meter->temperature = json_object_get_double(val);
254 }
255 }
256 if (json_object_object_get_ex(jobj, "pressure", &sensor)) {
257 if (json_object_object_get_ex(sensor, "state", &val)) {
258 if (co2meter->pressure_state)
259 free(co2meter->pressure_state);
260 co2meter->pressure_state = xstrcpy((char *)json_object_get_string(val));
261 }
262 if (json_object_object_get_ex(sensor, "channel", &val)) {
263 co2meter->pressure_channel = json_object_get_int(val);
264 }
265 if (json_object_object_get_ex(sensor, "voltage", &val)) {
266 co2meter->pressure_voltage = json_object_get_double(val);
267 }
268 if (json_object_object_get_ex(sensor, "zero", &val)) {
269 co2meter->pressure_zero = json_object_get_double(val);
270 }
271 if (json_object_object_get_ex(sensor, "bar", &val)) {
272 co2meter->pressure_bar = json_object_get_double(val);
273 }
274 }
275 json_object_put(jobj);
276
277 co2meter_ws_send(co2meter);
172 278
173 // co2meter_dump(co2meter); 279 // co2meter_dump(co2meter);
174 280
175 if (new_co2meter) { 281 if (new_co2meter) {
176 if (co2meters == NULL) { 282 if (co2meters == NULL) {

mercurial