HOST = "IP MQTT Broker"; PORT = 1883; KEEPALIVE = 60; PROTOCOL = "V31"; USERNAME = ""; PASSWORD = ""; CLIENT_ID = "shellyplusht-/rpc"; TOPIC = "shellies/shelly-/rpc"; QOS = 1; RETAIN = 0; MESSAGE = ""; TIMEOUT = 1000; CLEAN_SESSION = true; MQTT_HANDLE = 0; nb_config_set("custom.var0=0"); nb_config_set("custom.var1=0"); nb_config_set("custom.var2=0"); nb_config_set("custom.var3=0"); nb_config_set("custom.var4=0"); DEBUG=false; # Debug aktivieren mit true oder deaktivieren mit false. template shellyplusht_{ temperatur_zahl = ""; luftfeuchte_zahl = ""; percent_zahl = ""; battery_zahl = ""; letzteaenderung = ""; } /*create new template instance*/ shelly_data = new shellyplusht_(); /*create new mqtt instance*/ MQTT_HANDLE = nb_mqttlib_new(CLIENT_ID, CLEAN_SESSION); if (nb_mqttlib_set_protocol_version(MQTT_HANDLE, PROTOCOL) < 0 ) { printf("Unable to set Protocol version\n"); exit(1); } if (nb_mqttlib_set_user_pw(MQTT_HANDLE, USERNAME, PASSWORD) < 0 ) { printf("Unable to set Username and Passsword\n"); exit(1); } if (nb_mqttlib_connect(MQTT_HANDLE, HOST, PORT, KEEPALIVE) < 0 ) { printf("Unable to connect\n"); exit(1); } if (nb_mqttlib_subscribe(MQTT_HANDLE, TOPIC, QOS) < 0 ) { printf("Unable to subscribe\n"); exit(1); } while (true){ ret = nb_mqttlib_get_callback_message(MQTT_HANDLE, TIMEOUT); buffer=(string) ret.msg.msg; if(DEBUG) printf("Ausgabe unforamtierten Daten\n%s\n",buffer); temperatur_finden = strstr( buffer, '"tC"'); // Hier wird tC verarbeitet if(temperatur_finden != NULL){ if(DEBUG) printf("Temperatur Wert tC ist entalten\n"); laenger_vom_string = strlen(buffer); if(DEBUG) printf("Hier wird die laenge des Daten String bestimmt: %s Zeichen \n",laenger_vom_string); neuer_daten_string = substr(buffer, temperatur_finden+1,laenger_vom_string); if(DEBUG) printf("Neuer Daten String verkleinert:\n%s\n",neuer_daten_string); temperatur_block = strstr( neuer_daten_string, ','); if(DEBUG) printf("Bestimmen des Temperaturblock: %s Zeichen\n",temperatur_block); neuerblock = substr(neuer_daten_string, 0,temperatur_block); if(DEBUG) printf("Ausgabe des Tempaturblock\n%s\n",neuerblock); temperatur = strstr( neuerblock, ':'); if(DEBUG) printf("Nur der Tempaturwert %s Zeichen\n",temperatur); temperatur_zahl = substr(neuerblock, temperatur+1,laenger_vom_string); printf("Der Zahlenwert Temperatur: %s\n",temperatur_zahl); shelly_data.temperatur_zahl = temperatur_zahl; nb_config_set(sprintf("custom.var0=%s",shelly_data.temperatur_zahl)); datum_zeit = strftime("%d/%m/%Y__%H:%M:%S",localtime(time())); if(DEBUG) printf("Ausgabe des Datum und der Zeit %s\n", datum_zeit); shelly_data.letzteaenderung = datum_zeit; nb_config_set(sprintf("custom.var1=%s",shelly_data.letzteaenderung)); }else { printf("Der String tC ist nicht vorhanden\n"); } if(DEBUG) printf("Ausgabe unforamtierten Daten\n%s\n",buffer); luftfeuchte_finden = strstr( buffer, '"rh"'); // Hier wird rh verarbeitet if(luftfeuchte_finden != NULL){ if(DEBUG) printf("Luftfeuchte Wert rh ist entalten\n"); laenger_vom_string = strlen(buffer); if(DEBUG) printf("Hier wird die laenge des Daten String bestimmt: %s Zeichen \n",laenger_vom_string); neuer_daten_string = substr(buffer, luftfeuchte_finden+1,laenger_vom_string); if(DEBUG) printf("Neuer Daten String verkleinert:\n%s\n",neuer_daten_string); luftfeuchte_block = strstr(neuer_daten_string, '}'); if(DEBUG) printf("Bestimmen des Luftfeuchteblock: %s Zeichen\n",luftfeuchte_block); neuerblock = substr(neuer_daten_string, 0,luftfeuchte_block); if(DEBUG) printf("Ausgabe des Luftfeuchteblock\n%s\n",neuerblock); luftfeuchte = strstr( neuerblock, ':'); if(DEBUG) printf("Nur der Luftfeuchtewert %s Zeichen\n",luftfeuchte); luftfeuchte_zahl = substr(neuerblock, luftfeuchte+1,laenger_vom_string); printf("Der Zahlenwert Luftfeuchtigkeit: %s\n",luftfeuchte_zahl); shelly_data.luftfeuchte_zahl = luftfeuchte_zahl; nb_config_set(sprintf("custom.var2=%s",shelly_data.luftfeuchte_zahl)); }else { printf("Der String rh ist nicht vorhanden\n"); } if(DEBUG) printf("Ausgabe unforamtierten Daten\n%s\n",buffer); battery_finden = strstr( buffer, '"battery"'); // Hier wird battery verarbeitet if(battery_finden != NULL){ if(DEBUG) printf("Batteryspannungswert battery ist entalten\n"); laenger_vom_string = strlen(buffer); if(DEBUG) printf("Hier wird die laenge des Daten String bestimmt: %s Zeichen \n",laenger_vom_string); neuer_daten_string = substr(buffer, battery_finden+1,laenger_vom_string); if(DEBUG) printf("Neuer Daten String verkleinert:\n%s\n",neuer_daten_string); battery_block = strstr( neuer_daten_string, ','); if(DEBUG) printf("Bestimmen des batteryblock: %s Zeichen\n",battery_block); neuerblock = substr(neuer_daten_string, 0,battery_block); if(DEBUG) printf("Ausgabe des batteryblock\n%s\n",neuerblock); battery = strstr( neuerblock, ':'); if(DEBUG) printf("Nur der Battery Wert %s Zeichen\n",battery); battery_zahl = substr(neuerblock, battery+6,laenger_vom_string); if(battery_zahl >= 4){ printf("Die Batterie Spannung : %s Volt\n",battery_zahl); shelly_data.battery_zahl = battery_zahl; nb_config_set(sprintf("custom.var3=%s",shelly_data.battery_zahl)); if(DEBUG) printf("Ausgabe unforamtierten Daten\n%s\n",buffer); percent_finden = strstr( buffer, '"percent"'); // Hier wird percent verarbeitet if(percent_finden != NULL){ if(DEBUG) printf("Der String percent ist entalten\n"); laenger_vom_string = strlen(buffer); if(DEBUG) printf("Hier wird die laenge des Daten String bestimmt: %s Zeichen \n",laenger_vom_string); neuer_daten_string = substr(buffer, percent_finden+1,laenger_vom_string); if(DEBUG) printf("Neuer Daten String verkleinert:\n%s\n",neuer_daten_string); percent_block = strstr( neuer_daten_string, '}'); if(DEBUG) printf("Bestimmen des percentblock: %s Zeichen\n",percent_block); neuerblock = substr(neuer_daten_string, 0,percent_block); if(DEBUG) printf("Ausgabe des percentblock\n%s\n",neuerblock); percent = strstr( neuerblock, ':'); if(DEBUG) printf("Nur der percent Wert %s Zeichen\n",percent); percent_zahl = substr(neuerblock, percent+1,laenger_vom_string); printf("Der Prozentsatz der Batterie Spannung : %s Prozent\n",percent_zahl); shelly_data.percent_zahl = percent_zahl; nb_config_set(sprintf("custom.var4=%s",shelly_data.percent_zahl)); } else { printf("Der String percent ist nicht vorhanden\n"); } } else { printf("Der Shelly wird über USB-Netzteil versorgt: %s Volt nur.\n",battery_zahl); shelly_data.percent_zahl = "n/a"; shelly_data.battery_zahl = battery_zahl; nb_config_set(sprintf("custom.var3=%s",shelly_data.battery_zahl)); nb_config_set(sprintf("custom.var4=%s",shelly_data.percent_zahl)); } } else { printf("Der String battery ist nicht vorhanden\n"); } speicherzelle_1 = nb_config_get("custom.var0"); speicherzelle_2 = nb_config_get("custom.var1"); speicherzelle_3 = nb_config_get("custom.var2"); speicherzelle_4 = nb_config_get("custom.var3"); speicherzelle_5 = nb_config_get("custom.var4"); if(DEBUG) printf("Ausgabe von custom Speicherzelle_1 Temperatur: %s\n",speicherzelle_1); if(DEBUG) printf("Ausgabe von custom Speicherzelle_2 Datum Zeit: %s\n",speicherzelle_2); if(DEBUG) printf("Ausgabe von custom Speicherzelle_3 Luftfeuchtewert: %s\n",speicherzelle_3); if(DEBUG) printf("Ausgabe von custom Speicherzelle_4 Batteryspannungswert: %s\n",speicherzelle_4); if(DEBUG) printf("Ausgabe von custom Speicherzelle_5 Prozentsatz: %s\n",speicherzelle_5); # Bestimmung der Absolutendluftfeuchtigkeit in der Luft Gramm pro Kubikmeter I1 = (float) nb_config_get("custom.var0"); # Der Wert Temperatur I2 = (float) nb_config_get("custom.var2"); # Der Wert Luftfeuchtigkeit if(DEBUG) printf("Ausgabe von I1: und I2: \n"); if(DEBUG) dump(I1, I2); if(DEBUG) printf("\n"); # Berechnung der Absolutendluftfeuchtigkeit result = (10 ** 5 * 18.016/8314.3 * I2/100 * 6.1078 * (10 ** ((7.5*I1)/(237.3+I1))/(I1 + 273.15))); if(DEBUG) printf("\n"); if(DEBUG) print(result); if(DEBUG) printf("\n"); result = (string) result; if(DEBUG) printf("Absolutendluftfeuchtigkeit Berechnung: %s g/m³\n",result); nb_config_set(sprintf("custom.table2.0.var0=%s",result)); speicherzelle_result = nb_config_get("custom.table2.0.var0"); if(DEBUG) printf("Ausgabe von custom Speicherzelle_result Absolutendluftfeuchtigkeit: %s g/m³\n",speicherzelle_result); //For debugging //printf("Alle buffer Ausgaben:\n%s\n",buffer); if(ret<0){ nb_syslog("Failed to publish mqtt message"); } sleep(1); } exit(0);