Skip to content

Commit

Permalink
Merge pull request #327 from iprak/add-sensor-units
Browse files Browse the repository at this point in the history
HomeAssistant / Discovery / Add sensor units
  • Loading branch information
openshwprojects committed Oct 24, 2022
2 parents 8280e3f + 0a095bb commit 9447dd6
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 102 deletions.
186 changes: 101 additions & 85 deletions src/driver/drv_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,42 @@
#include "../httpserver/new_http.h"
#include "drv_public.h"

const char *sensor_mqttNames[OBK_NUM_MEASUREMENTS] = {
const char* sensor_mqttNames[OBK_NUM_MEASUREMENTS] = {
"voltage",
"current",
"power"
};

const char *counter_mqttNames[OBK_NUM_COUNTERS] = {
"energycounter",
"energycounter_last_hour",
"consumption_stats"
//sensor_device_classes just so happens to be the same as sensor_mqttNames.
const char* sensor_mqtt_device_classes[OBK_NUM_MEASUREMENTS] = {
"voltage",
"current",
"power"
};

const char *counter_devClasses[OBK_NUM_COUNTERS] = {
"energy",
"energy",
"None"
const char* sensor_mqtt_device_units[OBK_NUM_MEASUREMENTS] = {
"V",
"A",
"W"
};

const char* counter_mqttNames[OBK_NUM_COUNTERS] = {
"energycounter",
"energycounter_last_hour",
"consumption_stats"
};

const char* counter_devClasses[OBK_NUM_COUNTERS] = {
"energy",
"energy",
"None"
};

typedef struct driver_s {
const char *name;
const char* name;
void (*initFunc)();
void (*onEverySecond)();
void (*appendInformationToHTTPIndexPage)(http_request_t *request);
void (*appendInformationToHTTPIndexPage)(http_request_t* request);
void (*runQuickTick)();
void (*stopFunc)();
void (*onChannelChanged)(int ch, int val);
Expand All @@ -47,15 +60,15 @@ static driver_t g_drivers[] = {
{ "TuyaMCU", TuyaMCU_Init, TuyaMCU_RunFrame, NULL, NULL, NULL, NULL, false },
{ "NTP", NTP_Init, NTP_OnEverySecond, NULL, NULL, NULL, NULL, false },
{ "I2C", DRV_I2C_Init, DRV_I2C_EverySecond, NULL, NULL, NULL, NULL, false },

//These 4 measure power
{ "BL0942", BL0942_Init, BL0942_RunFrame, BL09XX_AppendInformationToHTTPIndexPage, NULL, NULL, NULL, false },
{ "BL0937", BL0937_Init, BL0937_RunFrame, BL09XX_AppendInformationToHTTPIndexPage, NULL, NULL, NULL, false },
{ "CSE7766", CSE7766_Init, CSE7766_RunFrame, BL09XX_AppendInformationToHTTPIndexPage, NULL, NULL, NULL, false },

//Test drivers
{ "TESTPOWER", Test_Power_Init, Test_Power_RunFrame, BL09XX_AppendInformationToHTTPIndexPage, NULL, NULL, NULL, false },
{ "TESTLED", Test_LED_Driver_Init, Test_LED_Driver_RunFrame, NULL, NULL, NULL, Test_LED_Driver_OnChannelChanged, false },
{ "TESTLED", Test_LED_Driver_Init, Test_LED_Driver_RunFrame, NULL, NULL, NULL, Test_LED_Driver_OnChannelChanged, false },

#if PLATFORM_BEKEN
{ "IR", DRV_IR_Init, NULL, NULL, DRV_IR_RunFrame, NULL, NULL, false },
Expand All @@ -68,14 +81,14 @@ static driver_t g_drivers[] = {
{ "tmSensor", TuyaMCU_Sensor_Init, TuyaMCU_Sensor_RunFrame, NULL, NULL, NULL, NULL, false }
};

static const int g_numDrivers = sizeof(g_drivers)/sizeof(g_drivers[0]);
static const int g_numDrivers = sizeof(g_drivers) / sizeof(g_drivers[0]);

bool DRV_IsRunning(const char *name) {
bool DRV_IsRunning(const char* name) {
int i;

for(i = 0; i < g_numDrivers; i++) {
if(g_drivers[i].bLoaded) {
if(!stricmp(name,g_drivers[i].name)) {
for (i = 0; i < g_numDrivers; i++) {
if (g_drivers[i].bLoaded) {
if (!stricmp(name, g_drivers[i].name)) {
return true;
}
}
Expand All @@ -88,28 +101,28 @@ static SemaphoreHandle_t g_mutex = 0;
bool DRV_Mutex_Take(int del) {
int taken;

if(g_mutex == 0)
if (g_mutex == 0)
{
g_mutex = xSemaphoreCreateMutex( );
g_mutex = xSemaphoreCreateMutex();
}
taken = xSemaphoreTake( g_mutex, del );
if (taken == pdTRUE) {
taken = xSemaphoreTake(g_mutex, del);
if (taken == pdTRUE) {
return true;
}
return false;
}
void DRV_Mutex_Free() {
xSemaphoreGive( g_mutex );
xSemaphoreGive(g_mutex);
}
void DRV_OnEverySecond() {
int i;

if(DRV_Mutex_Take(100)==false) {
if (DRV_Mutex_Take(100) == false) {
return;
}
for(i = 0; i < g_numDrivers; i++) {
if(g_drivers[i].bLoaded) {
if(g_drivers[i].onEverySecond != 0) {
for (i = 0; i < g_numDrivers; i++) {
if (g_drivers[i].bLoaded) {
if (g_drivers[i].onEverySecond != 0) {
g_drivers[i].onEverySecond();
}
}
Expand All @@ -119,88 +132,91 @@ void DRV_OnEverySecond() {
void DRV_RunQuickTick() {
int i;

if(DRV_Mutex_Take(0)==false) {
if (DRV_Mutex_Take(0) == false) {
return;
}
for(i = 0; i < g_numDrivers; i++) {
if(g_drivers[i].bLoaded) {
if(g_drivers[i].runQuickTick != 0) {
for (i = 0; i < g_numDrivers; i++) {
if (g_drivers[i].bLoaded) {
if (g_drivers[i].runQuickTick != 0) {
g_drivers[i].runQuickTick();
}
}
}
DRV_Mutex_Free();
}
void DRV_OnChannelChanged(int channel,int iVal) {
void DRV_OnChannelChanged(int channel, int iVal) {
int i;

//if(DRV_Mutex_Take(100)==false) {
// return;
//}
for(i = 0; i < g_numDrivers; i++) {
if(g_drivers[i].bLoaded){
if(g_drivers[i].onChannelChanged != 0) {
g_drivers[i].onChannelChanged(channel,iVal);
for (i = 0; i < g_numDrivers; i++) {
if (g_drivers[i].bLoaded) {
if (g_drivers[i].onChannelChanged != 0) {
g_drivers[i].onChannelChanged(channel, iVal);
}
}
}
//DRV_Mutex_Free();
}
void DRV_StopDriver(const char *name) {
void DRV_StopDriver(const char* name) {
int i;

if(DRV_Mutex_Take(100)==false) {
if (DRV_Mutex_Take(100) == false) {
return;
}
for(i = 0; i < g_numDrivers; i++) {
if(!stricmp(g_drivers[i].name,name)) {
if(g_drivers[i].bLoaded){
if(g_drivers[i].stopFunc != 0) {
for (i = 0; i < g_numDrivers; i++) {
if (!stricmp(g_drivers[i].name, name)) {
if (g_drivers[i].bLoaded) {
if (g_drivers[i].stopFunc != 0) {
g_drivers[i].stopFunc();
}
g_drivers[i].bLoaded = false;
addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Drv %s has been stopped.\n",name);
break ;
} else {
addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Drv %s is not running.\n",name);
break ;
addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "Drv %s has been stopped.\n", name);
break;
}
else {
addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "Drv %s is not running.\n", name);
break;
}
}
}
DRV_Mutex_Free();
}
void DRV_StartDriver(const char *name) {
void DRV_StartDriver(const char* name) {
int i;
int bStarted;

if(DRV_Mutex_Take(100)==false) {
if (DRV_Mutex_Take(100) == false) {
return;
}
bStarted = 0;
for(i = 0; i < g_numDrivers; i++) {
if(!stricmp(g_drivers[i].name,name)) {
if(g_drivers[i].bLoaded){
addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Drv %s is already loaded.\n",name);
for (i = 0; i < g_numDrivers; i++) {
if (!stricmp(g_drivers[i].name, name)) {
if (g_drivers[i].bLoaded) {
addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "Drv %s is already loaded.\n", name);
bStarted = 1;
break ;
break;

} else {
}
else {
g_drivers[i].initFunc();
g_drivers[i].bLoaded = true;
addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Started %s.\n",name);
addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "Started %s.\n", name);
bStarted = 1;
break ;
break;
}
}
}
if(!bStarted) {
addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Driver %s is not known in this build.\n",name);
addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Available drivers: ");
for(i = 0; i < g_numDrivers; i++) {
if(i == 0) {
addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"%s",g_drivers[i].name);
} else {
addLogAdv(LOG_INFO, LOG_FEATURE_NTP,", %s",g_drivers[i].name);
if (!bStarted) {
addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "Driver %s is not known in this build.\n", name);
addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "Available drivers: ");
for (i = 0; i < g_numDrivers; i++) {
if (i == 0) {
addLogAdv(LOG_INFO, LOG_FEATURE_NTP, "%s", g_drivers[i].name);
}
else {
addLogAdv(LOG_INFO, LOG_FEATURE_NTP, ", %s", g_drivers[i].name);
}
}
}
Expand All @@ -209,58 +225,58 @@ void DRV_StartDriver(const char *name) {
// startDriver DGR
// startDriver BL0942
// startDriver BL0937
static int DRV_Start(const void *context, const char *cmd, const char *args, int cmdFlags) {
static int DRV_Start(const void* context, const char* cmd, const char* args, int cmdFlags) {
DRV_StartDriver(args);
return 1;
}
static int DRV_Stop(const void *context, const char *cmd, const char *args, int cmdFlags) {
static int DRV_Stop(const void* context, const char* cmd, const char* args, int cmdFlags) {
DRV_StopDriver(args);
return 1;
}

void DRV_Generic_Init() {
CMD_RegisterCommand("startDriver","",DRV_Start, "Starts driver", NULL);
CMD_RegisterCommand("stopDriver","",DRV_Stop, "Stops driver", NULL);
CMD_RegisterCommand("startDriver", "", DRV_Start, "Starts driver", NULL);
CMD_RegisterCommand("stopDriver", "", DRV_Stop, "Stops driver", NULL);
}
void DRV_AppendInformationToHTTPIndexPage(http_request_t *request) {
void DRV_AppendInformationToHTTPIndexPage(http_request_t* request) {
int i, j;
int c_active = 0;

if(DRV_Mutex_Take(100)==false) {
if (DRV_Mutex_Take(100) == false) {
return;
}
for(i = 0; i < g_numDrivers; i++) {
if(g_drivers[i].bLoaded){
for (i = 0; i < g_numDrivers; i++) {
if (g_drivers[i].bLoaded) {
c_active++;
if(g_drivers[i].appendInformationToHTTPIndexPage) {
if (g_drivers[i].appendInformationToHTTPIndexPage) {
g_drivers[i].appendInformationToHTTPIndexPage(request);
}
}
}
DRV_Mutex_Free();

hprintf128(request,"<h5>%i drivers active",c_active);
if(c_active>0){
hprintf128(request, "<h5>%i drivers active", c_active);
if (c_active > 0) {
j = 0;// printed 0 names so far
// generate active drivers list in ( )
hprintf128(request," (");
for(i = 0; i < g_numDrivers; i++) {
if(g_drivers[i].bLoaded){
hprintf128(request, " (");
for (i = 0; i < g_numDrivers; i++) {
if (g_drivers[i].bLoaded) {
// if at least one name printed, add separator
if(j != 0) {
hprintf128(request,",");
if (j != 0) {
hprintf128(request, ",");
}
hprintf128(request,g_drivers[i].name);
hprintf128(request, g_drivers[i].name);
// one more name printed
j++;
}
}
hprintf128(request,")");
hprintf128(request, ")");
}
hprintf128(request,", total %i</h5>",g_numDrivers);
hprintf128(request, ", total %i</h5>", g_numDrivers);
}

bool DRV_IsMeasuringPower(){
bool DRV_IsMeasuringPower() {
#ifndef OBK_DISABLE_ALL_DRIVERS
return DRV_IsRunning("BL0937") || DRV_IsRunning("BL0942") || DRV_IsRunning("CSE7766") || DRV_IsRunning("TESTPOWER");
#else
Expand Down
32 changes: 17 additions & 15 deletions src/driver/drv_public.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,33 @@ enum {
};

enum {
OBK_CONSUMPTION_TOTAL = OBK_NUM_MEASUREMENTS,
OBK_CONSUMPTION_LAST_HOUR,
OBK_CONSUMPTION_STATS,
OBK_NUM_EMUNS_MAX
OBK_CONSUMPTION_TOTAL = OBK_NUM_MEASUREMENTS,
OBK_CONSUMPTION_LAST_HOUR,
OBK_CONSUMPTION_STATS,
OBK_NUM_EMUNS_MAX
};

#define OBK_NUM_COUNTERS (OBK_NUM_EMUNS_MAX-OBK_NUM_MEASUREMENTS)
#define OBK_NUM_SENSOR_COUNT OBK_NUM_EMUNS_MAX

// MQTT names of sensors (voltage, current, power)
extern const char *sensor_mqttNames[];
extern const char *counter_mqttNames[];
extern const char *counter_devClasses[];
extern const char* sensor_mqttNames[];
extern const char* sensor_mqtt_device_classes[];
extern const char* sensor_mqtt_device_units[];
extern const char* counter_mqttNames[];
extern const char* counter_devClasses[];

void DRV_Generic_Init();
void DRV_AppendInformationToHTTPIndexPage(http_request_t *request);
void DRV_AppendInformationToHTTPIndexPage(http_request_t* request);
void DRV_OnEverySecond();
void DRV_RunQuickTick();
void DRV_StartDriver(const char *name);
void DRV_StopDriver(const char *name);
bool DRV_IsRunning(const char *name);
void DRV_OnChannelChanged(int channel,int iVal);
void SM2135_Write(byte *rgbcw);
void BP5758D_Write(byte *rgbcw);
void BP1658CJ_Write(byte *rgbcw);
void DRV_StartDriver(const char* name);
void DRV_StopDriver(const char* name);
bool DRV_IsRunning(const char* name);
void DRV_OnChannelChanged(int channel, int iVal);
void SM2135_Write(byte* rgbcw);
void BP5758D_Write(byte* rgbcw);
void BP1658CJ_Write(byte* rgbcw);
void DRV_DGR_OnLedDimmerChange(int iVal);
void DRV_DGR_OnLedEnableAllChange(int iVal);

Expand Down

0 comments on commit 9447dd6

Please sign in to comment.