Blitzwolf-SHP6

djack2017
Posty: 350
Rejestracja: pn lis 27, 2017 7:36 am

ndz paź 06, 2019 7:23 pm

Dla porządku informuję, że jest firmware dla sterownika Blitzwolf-SHP6 dla systemu SUPLA i Zabbix. Współczynniki kalibracji wpisuje się na stronie konfiguracji urządzenia. Urządzenie wyświetla wyniki w apce na smartfonie zgodnie ze standardem @pzygmunta.
Zastosowany został programowy filtr przeciwzakłóceniowy, więc urządzenie nie powinno być wraźliwe na elektryczne zakłócenia zewnętrzne.
Patryk
Posty: 690
Rejestracja: pn sty 07, 2019 7:51 pm

ndz paź 06, 2019 7:35 pm

djack2017 pisze:
ndz paź 06, 2019 7:23 pm
Zastosowany został programowy filtr przeciwzakłóceniowy, więc urządzenie nie powinno być wraźliwe na elektryczne zakłócenia zewnętrzne.
Istnieje możliwość udostępnienia kodu źródłowego ?
djack2017
Posty: 350
Rejestracja: pn lis 27, 2017 7:36 am

ndz paź 06, 2019 8:04 pm

Obsługa filtru jest bardzo prosta. W pliku supla_esp_gpio.c jest procedura obsługi przerwania o nazwie supla_esp_gpio_input_timer_cb(void *timer_arg)
Dołożyłem zmienną active_filter i odpowiednio zmieniłem w kilku miejscach tej procedury, kod programu, związany z tą zmienną :

Kod: Zaznacz cały

unsigned char active_filter = 0;

LOCAL void
supla_esp_gpio_input_timer_cb(void *timer_arg) {

	supla_input_cfg_t *input_cfg = (supla_input_cfg_t *)timer_arg;
	uint8 v = gpio__input_get(input_cfg->gpio_id);
	uint8 active = (input_cfg->flags & INPUT_FLAG_PULLUP) ? 0 : 1;

	if ( input_cfg->step == 1 ) {
		
		if ( v == active ) {

			input_cfg->cycle_counter = 1;

			if ( input_cfg->flags & INPUT_FLAG_CFG_BTN
				 && ( input_cfg->type == INPUT_TYPE_BTN_MONOSTABLE
					  || input_cfg->type == INPUT_TYPE_BTN_MONOSTABLE_RS
				      || (system_get_time() - input_cfg->last_active) >= 2000000 ) ) {

				input_cfg->cfg_counter = 0;
			}
			input_cfg->step = 2;
			active_filter = 1;
			return;

		} else {

			if ( input_cfg->cycle_counter >= INPUT_MIN_CYCLE_COUNT ) {

				if (active_filter == 1) {
					supla_esp_gpio_on_input_inactive(input_cfg);
					#if defined(SHP6)
						supla_esp_gpio_set_hi(LED_RED_PORT2, 1);
					#endif
					active_filter = 0;
				}

			} else if ( input_cfg->cycle_counter < 255 ) {
				input_cfg->cycle_counter++;
				return;
			}
		}

	} else if ( input_cfg->step > 1 ) {

		if ( input_cfg->cycle_counter < 255 )
			input_cfg->cycle_counter++;

		if ( v == active ) {

			if ( input_cfg->step == 3
					&& input_cfg->flags & INPUT_FLAG_CFG_BTN
					&& ( input_cfg->type == INPUT_TYPE_BTN_MONOSTABLE
						 || input_cfg->type == INPUT_TYPE_BTN_MONOSTABLE_RS) ) {

				if ( input_cfg->cfg_counter < 2048 )
					input_cfg->cfg_counter++;

				if ( supla_esp_restart_on_cfg_press == 1 ) {
					system_restart();
					return;
				}

				if ( (input_cfg->cfg_counter * INPUT_CYCLE_TIME) >= GET_CFG_PRESS_TIME(input_cfg) ) {

					// CFG MODE
					if ( supla_esp_cfgmode_started() == 0 ) {

						supla_esg_gpio_start_cfg_mode();

					} else if ( input_cfg->flags & INPUT_FLAG_FACTORY_RESET ) {

						factory_defaults(1);
						os_delay_us(500000);
						system_restart();
					}

					input_cfg->step = 0;
					os_timer_disarm(&input_cfg->timer);
					return;
				}
			}

			if ( input_cfg->step == 2
				 && input_cfg->cycle_counter >= INPUT_MIN_CYCLE_COUNT ) {
				
				if (active_filter == 1) {
					supla_esp_gpio_on_input_active(input_cfg);
					#if defined(SHP6)
						supla_esp_gpio_set_hi(LED_RED_PORT2, 0);
					#endif
					active_filter = 0;
				}

				if ( (input_cfg->flags & INPUT_FLAG_CFG_BTN) == 0
						|| input_cfg->type == INPUT_TYPE_BTN_BISTABLE ) {

					os_timer_disarm(&input_cfg->timer);
				}

				input_cfg->cycle_counter = 1;
				input_cfg->last_active = system_get_time();
				input_cfg->step = 3;
			}

			return;
		}

		if ( input_cfg->step == 3 ) {
			
			if ( input_cfg->cycle_counter >= INPUT_MIN_CYCLE_COUNT ) {

				if ( input_cfg->flags & INPUT_FLAG_CFG_BTN
						&& input_cfg->type == INPUT_TYPE_BTN_BISTABLE ) {

					input_cfg->cfg_counter++;

					if ( supla_esp_cfgmode_started() == 0 ) {

						if ( input_cfg->cfg_counter >= CFG_BTN_PRESS_COUNT ) {
							input_cfg->cfg_counter = 0;

							// CFG MODE
							supla_esg_gpio_start_cfg_mode();
						}

					} else if ( (system_get_time() - supla_esp_cfgmode_entertime) > 3000000 ) {

						//  EXIT CFG MODE
						system_restart();

					}
				}

				if ( input_cfg->flags & INPUT_FLAG_CFG_BTN
						&& supla_esp_cfgmode_started() == 1
						&& ( input_cfg->type == INPUT_TYPE_BTN_MONOSTABLE
							 || input_cfg->type == INPUT_TYPE_BTN_MONOSTABLE_RS )
						&& (system_get_time() - supla_esp_cfgmode_entertime) > 3000000 ) {

					// EXIT CFG MODE
					system_restart();

				} else {

					supla_esp_gpio_on_input_inactive(input_cfg);

				}


			} else {
				return;
			}

		}

	}

    input_cfg->step = 0;
    os_timer_disarm(&input_cfg->timer);
}
Patryk
Posty: 690
Rejestracja: pn sty 07, 2019 7:51 pm

ndz paź 06, 2019 8:12 pm

Dziękuję !!!
Awatar użytkownika
wojtas567
Posty: 1891
Rejestracja: ndz kwie 03, 2016 7:16 pm
Lokalizacja: Olsztyn

pn lis 04, 2019 10:50 am

Ostatnio sprawdzałem tym gniazdkiem zużycie w innym miejscu i gniazdo było wyłączone na godzinkę a na wykresie jest w tym czasie zużycie
Screenshot_20191103-163140_1.png
Screenshot_20191103-163140_1.png (149.29 KiB) Przejrzano 992 razy
Pozdrawiam
Wojtek
Awatar użytkownika
pzygmunt
Posty: 7652
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontaktowanie:

pn lis 04, 2019 11:00 am

Wykresy wypełniają luki po to by w przypadku braku internetu nie wyszło, że w 10 min zużyłeś 5kWh, a w rzeczywistości zużyłeś to w np 1h.
Przykład.

Stan licznika o godz. 13:00 150kWh
Kolejny pomiar w historii o 14:00 155kWh czyli licznik był offline przez godzinę.
Wykres różnicę czyli 155-150 = 5 podzieli przez 6 czyli 60 min/10 min = 6.
Wykres pokaże wypełnienie luki równymi pomiarami każdy po ~0,83kWh

Inaczej miałbyś szpilkę.
Jeżeli gniazdko było całkowicie odłączone to stawiam, że jest tam jakiś błąd (może pamięć) i nagle po włączeniu naliczyło sobie kilka kWh, a wykres to podzielił proporcjonalnie do ostatniego w historii pomiaru.
Awatar użytkownika
wojtas567
Posty: 1891
Rejestracja: ndz kwie 03, 2016 7:16 pm
Lokalizacja: Olsztyn

pn lis 04, 2019 11:27 am

Tak gniazdko było całkowicie wyłączone miałem w kieszeni.
Jak jest włączone a urządzenie nie pobiera to widać na wykresie 0.
Pozdrawiam
Wojtek
Awatar użytkownika
pzygmunt
Posty: 7652
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontaktowanie:

pn lis 04, 2019 11:36 am

To w takim razie wygląda na to, że po podłączeniu gniazdko skądś wzięło sobie dodatkowe kWh. Bardzo możliwe, że jest to błąd pamięci.
Generalnie ten firmware powinien zapisywać zawsze dwie kopie we flashu razem z sumą kontrolną.
To pozwala uniknąć sytuacji w której podczas zapisu wyłączysz zasilanie i uszkodzeniu ulegną zapisane w pamięci dane.
djack2017
Posty: 350
Rejestracja: pn lis 27, 2017 7:36 am

śr lis 27, 2019 9:49 am

Okazja - do 3 grudnia SHP-6 jest w cenie 39 zł:
https://www.banggood.com/BlitzWolf-BW-S ... rehouse=CN
Awatar użytkownika
Demolkaa
Posty: 220
Rejestracja: czw paź 11, 2018 8:42 pm
Lokalizacja: Twardowice

śr lis 27, 2019 9:51 pm

no to mnie wyje.... dodałem gniazdko do koszyka i zanim załatwiłem transakcje to z konta ściągnęło mi 52zł a w koszyku normalnie miałem 39zł
ODPOWIEDZ