Czołem!
Zmartwiony coraz większymi rachunkami za wodę, gaz i prąd postanowiłem przyjrzeć się bliżej temu, skąd u nas w domu bierze się aż tak duże zużycie – głównie wody.
Duże zużycie gazu w sezonie grzewczym da się zrozumieć. Bardzo duże zużycie prądu przy farmie ośmiu drukarek 3D w domu też było do przewidzenia, ale zużycie wody na poziomie ~25m3/mc bardzo mocno zaczęło nas zastanawiać. Szczególnie, że w tym samym okresie w zeszłym roku zużycie było dwukrotnie niższe!
Długo nie myśląc postanowiłem oczujnikować wszystkie trzy liczniki w domu (woda, gaz i prąd) i zbierać z nich dane, które później mógłbym przeanalizować.
W domu mam dokładnie takie liczniki i dla każdego z nich musiałem wykombinować inny sposób odczytu danych ;)
Licznik wody Flodis
Do odczytów impulsów z wodomierza wykorzystałem to, że na wskazówce znajduje się mała blaszka. Wystarczyło nad okienkiem umieścić czujnik indukcyjny, aby otrzymywać impulsy przy każdym pełnym obrocie wskazówki.
Na Thingiverse znalazłem nawet gotowy model uchwytu czujnika do tego wodomierza: https://www.thingiverse.com/thing:4146391. Model nie jest może idealny, ale spełnia swoje zadanie, więc nie bawiłem się już w modelowanie swojego uchwytu.
Jeżeli chodzi o czujnik, to użyłem czujnika indukcyjnego IB060NM61VB3. Dlaczego akurat ten czujnik? Bo miałem taki pod ręką :) Jakiś czas temu (dłuższy czas temu) dostałem kilka takich w prezencie od jednego z Was – od Marcina z firmy DEIRING. Do tej pory leżały w szufladzie, aż życie samo podsunęło idealne zastosowanie dla takiego czujnika. Dzięki MrLewerence!
W tym konkretnym projekcie ten czujnik ma jedną maleńką wadę – pracuje na napięciu >10V (i takie napięcie również podaje po wykryciu impulsu), a dla ESP8266, którego używam do wysyłania danych na serwer po WiFi, zalecanym napięciem jest 3,3V (przy 5V też daje radę). Chcąc całkowicie odizolować czujnik od ESP podłączyłem go za pośrednictwem transoptora. Jeżeli w swoim projekcie wykorzystacie czujnik pracujący na niższym napięciu, będziecie mieli trochę łatwiej ;)
Jak widzicie, nie użyłem tutaj gołej płytki ESP8266, lecz modułu WEMOS D1. Jest to nic innego, jak ESP z wygodnym programatorem USB, więc można ją programować równie łatwo co zwykłe Arduino, bez potrzeby używania zewnętrznych programatorów.
Cały układ zasiliłem napięciem 12V oraz dodałem małą przetwornicę STEP-DOWN, która obniża napięcie do zasilania płytki D1.
Licznik gazu ACTARIS GALLUS 2000
Z gazomierzem sprawa była dużo prostsza, ponieważ posiada dedykowane gniazdo do podpięcia czujnika, w którym okresowo pojawia się pole magnetyczne. Wystarczyło więc zrobić szybki projekt mocowania i do odczytów impulsów wykorzystać najzwyklejszy kontaktron o wartości 3,3 zł.
Wszystkie moje modele znajdziecie do pobrania na końcu artykułu.
W przypadku gazomierza schemat podłączenia jest jeszcze prostszy:
Tutaj do zasilania można już użyć dowolnej ładowarki USB 5V.
Licznik prądu PAFAL TYP C52
Powoli wymieniamy całą instalację elektryczną w domu na nową, ale jako główny licznik prądu nadal wisi to analogowe cudo techniki wyprodukowane niemal 30 lat temu ;) Póki nie przepniemy całej instalacji pod nową skrzynkę, musiałem wykombinować sposób na odczyt zużycia z tego staruszka.
Początkowo rozważałem zagonienie do roboty Raspberry Pi z kamerą i oprogramowania OCR. Na Forbocie znalazłem nawet gotowca, którego wystarczyło wcielić w życie, ale cały ten projekt wydawał mi się strzelaniem z armaty do muchy.
W naszej majsterkowej grupie na fejsie Maciek podsunął pomysł, żeby zastosować transoptor odbiciowy (czujnik odległości IR). I był to strzał w dziesiątkę!
Po przeszukaniu szufladek z elektroniką znalazłem kupiony przed laty gotowy czujnik TCRT5000.
Jak widzicie, są to po prostu dwie diody – jedna świeci światłem podczerwonym, a za pomocą drugiej diody (diody odbiorczej / fotodiody / fototranzystora) możemy sprawdzić ile światła odbija się i wraca. Dzięki temu, że na talerzu obracającym się w liczniku prądu znajduje się namalowane czarne pole (które odbija dużo mniej światła). bez problemu można odczytywać z niego impulsy za pomocą takiego czujnika (lub po prostu dwóch diod IR – nadawczej i odbiorczej).
Do zamocowania czujnika wymodelowałem proste mocowanie, które dodatkowo ogranicza dopływ światła z zewnątrz do diody odbiorczej:
I tutaj pojawia się ważna kwestia – tego typu patent można zastosować tylko wtedy, gdy licznik znajduje się w jakiejś zaciemnionej szafce. Jeżeli licznik znajduje się gdzieś na wierzchu, trzeba by zakleić całą szybę czarną taśmą, aby światło słoneczne (lub z oświetlenia pokoju) nie zakłócało pomiarów.
Początkowo próbowałem podpinać diodę odbiorczą pod wejście analogowe w ESP8266 i poprzez analizę odczytów wyłapywać obrót talerza, ale przy takim rozwiązaniu nie mógłbym wykorzystać przerwań do zliczania impulsów. Gdyby impuls wpadł akurat w trakcie wysyłania danych na serwer, to mógłby nie zostać zliczony.
Poszedłem zatem inną drogą – za pomocą dodatkowego potencjometru podpiętego pod diodę odbiorczą ustawiłem całość tak, żeby po podpięciu pod wejście cyfrowe otrzymywać od razu zero lub jedynkę logiczną.
Tutak także zasiliłem płytkę ze zwykłej ładowarki USB.
Program do wysyłania danych na serwer
Poniżej przedstawiam program dla licznika prądu.
Tak, wiem – te moje kody to czysta amatorszczyzna grubymi nićmi szyta. Napisałem to tak, jak umiałem i jestem pewny, że dałoby się to napisać lepiej. Najważniejsze jednak, że całość działa bez zarzutu.
W pozostałych licznikach wszystko wygląda analogicznie.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
#include <Timers.h> #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> ESP8266WebServer server(80); Timer wyslijTimer; Timer diodaPradTimer; const char* ssid = "majsterkowo.pl"; const char* password = "*************"; const char* host = "192.168.111.10"; #define diodaPrad 5 // pin D1 #define pradPin 2 // pin D4 unsigned long stanPradu = 0; unsigned long impulsyPrad = 0; unsigned long trzyImpulsyPrad = 0; unsigned long wysylaneImpulsyPrad = 0; int odczytPrad = 0; #define cykl 60 // secs ICACHE_RAM_ATTR void impulsPradowy() { static unsigned long last_interrupt_time_P = 0; unsigned long interrupt_time_P = millis(); if(interrupt_time_P - last_interrupt_time_P > 500) { impulsyPrad++; trzyImpulsyPrad++; if(trzyImpulsyPrad == 3) { stanPradu = stanPradu+25; trzyImpulsyPrad = 0; } digitalWrite(diodaPrad, HIGH); diodaPradTimer.begin(300); } last_interrupt_time_P = interrupt_time_P; } void zapiszStan() { String message = ""; message = "Licznik pradu = "; message += server.arg("prad"); stanPradu = atol(server.arg("prad").c_str()); server.send(200, "text/plain", message); } void setup() { pinMode(prad, INPUT_PULLUP); pinMode(diodaPrad, OUTPUT); digitalWrite(diodaPrad, HIGH); delay(300); digitalWrite(diodaPrad, LOW); delay(300); digitalWrite(diodaPrad, HIGH); delay(300); digitalWrite(diodaPrad, LOW); attachInterrupt(digitalPinToInterrupt(prad), impulsPradowy, RISING); Serial.begin(115200); delay(10); Serial.println(); Serial.print("Laczenie z siecia "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("WiFi polaczone: "); Serial.println(WiFi.localIP()); server.on("/stan", zapiszStan); server.begin(); Serial.println("Serwer uruchomiony"); wyslijTimer.begin(SECS(cykl)); } void loop() { server.handleClient(); if(diodaPradTimer.available()) { digitalWrite(diodaPrad, LOW); diodaPradTimer.time(STOP); } if(wyslijTimer.available()) { wyslijTimer.begin(SECS(cykl)); Serial.print(">>> laczenie z "); Serial.println(host); WiFiClient client; const int httpPort = 80; if(!client.connect(host, httpPort)) { Serial.println(">>> blad polaczenia"); return; } wysylaneImpulsyPrad = impulsyPrad; impulsyPrad = 0; String url = "/liczniki/dodaj_prad.php"; url += "?impulsyPrad="; url += wysylaneImpulsyPrad; url += "&stanPradu="; url += stanPradu; Serial.print(">>> URL: "); Serial.println(url); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while(client.available() == 0) { if(millis() - timeout > 5000) { Serial.println(">>> przekroczono czas polaczenia!"); client.stop(); impulsyPrad = impulsyPrad + wysylaneImpulsyPrad; return; } } Serial.println(); Serial.println(">>> zamykanie polaczenia"); Serial.println(); } } |
I krótkie wyjaśnienie najważniejszych części programu:
1 2 |
#define diodaPrad 5 // pin D1 #define pradPin 2 // pin D4 |
Dioda LED sygnalizująca zaliczenie impulsu jest podpięta do GPIO5 (jest to pin D1 w ESP8266). Z kolei pod GPIO2 jest podpięta dioda odbiorcza z czujnika wyłapującego impulsy.
1 |
#define cykl 60 // secs |
Tutaj jest zdefiniowane, jak często ESP ma wysyłać dane na serwer (w moim przypadku co minutę).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
ICACHE_RAM_ATTR void impulsPradowy() { static unsigned long last_interrupt_time_P = 0; unsigned long interrupt_time_P = millis(); if(interrupt_time_P - last_interrupt_time_P > 500) { impulsyPrad++; trzyImpulsyPrad++; if(trzyImpulsyPrad == 3) { stanPradu = stanPradu+25; trzyImpulsyPrad = 0; } digitalWrite(diodaPrad, HIGH); diodaPradTimer.begin(300); } last_interrupt_time_P = interrupt_time_P; } |
To jest funkcja obsługująca przerwanie wywoływane przy wykryciu impulsu. Jest tutaj po prostu dodawane +1 do zmiennej impulsyPrad.
Jak pewnie zauważyliście, ESP nie tylko zlicza kolejne impulsy, ale również cały czas aktualizuje sobie w pamięci aktualny stan licznika. Tzn po uruchomieniu trzeba go ustawić, a później ESP już sam go pilnuje ;)
W przypadków licznika wody i gazu sprawa jest prosta, bo w tych licznikach jest prosty przelicznik impulsów:
- wodomierz: jeden impuls to 0,0001 m3 wody,
- gazomierz: jeden impuls to 0,001 m3 gazu.
W liczniku prądu mam 120 impulsów na 1 kWh (120 obr./kWh). Żeby nie babrać się z kosmicznymi ułamkami przy aktualizowaniu stanu licznika po każdym impulsie, aktualizuję jego stan co trzy impulsy dodając do wskazania 25.
Dlaczego 25 a nie 0,025? Z tego samego powodu, który podałem wyżej – żeby uniknąć w ESP operowania na ułamkach. We wszystkich ESP stany liczników przechowuję w postaci liczb całkowitych i dopiero na serwerze dzielę je sobie przez /1000 lub /100 uzyskując docelowe wskazanie licznika.
Przerwanie jest zdefiniowane w linii:
1 |
attachInterrupt(digitalPinToInterrupt(pradPin), impulsPradowy, RISING); |
Ok, lećmy dalej :)
1 |
server.on("/stan", zapiszStan); |
1 2 3 4 5 6 7 8 9 |
void zapiszStan() { String message = ""; message = "Licznik pradu = "; message += server.arg("prad"); stanPradu = atol(server.arg("prad").c_str()); server.send(200, "text/plain", message); } |
Te dwa kawałki kodu odpowiadają za ustawianie aktualnego stanu czujnika po włączeniu ESP. Wystarczy wysłać do ESP proste zapytanie, aby ustawić aktualny stan licznika:
1 |
http://192.168.111.11/stan?prad=123456789 |
Stan licznika zostanie zapisany w pamięci ESP i będzie na bieżąco aktualizowany i wysyłany na serwer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
if(wyslijTimer.available()) { wyslijTimer.begin(SECS(cykl)); Serial.print(">>> laczenie z "); Serial.println(host); WiFiClient client; const int httpPort = 80; if(!client.connect(host, httpPort)) { Serial.println(">>> blad polaczenia"); return; } wysylaneImpulsyPrad = impulsyPrad; impulsyPrad = 0; String url = "/liczniki/dodaj_prad.php"; url += "?impulsyPrad="; url += wysylaneImpulsyPrad; url += "&stanPradu="; url += stanPradu; Serial.print(">>> URL: "); Serial.println(url); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while(client.available() == 0) { if(millis() - timeout > 5000) { Serial.println(">>> przekroczono czas polaczenia!"); client.stop(); impulsyPrad = impulsyPrad + wysylaneImpulsyPrad; return; } } Serial.println(); Serial.println(">>> zamykanie polaczenia"); Serial.println(); } |
I to jest ostatnia ważna część programu. Odpowiada ona za cykliczne wysyłanie danych na serwer. Informacja o ilości impulsów zliczonych od czasu ostatniej wysyłki oraz o stanie licznika jest wysyłana na serwer w prostym zapytaniu GET:
1 |
http://192.168.111.10/liczniki/dodaj.php?impulsyPrad=7&stanPradu=123456789 |
Po stronie serwera pozostaje już tylko odebrać zapytanie i zapisać dane w bazie.
Bazy danych
Na potrzeby swoich liczników zrobiłem w bazie danych dwie tabele:
- impulsy – co minutę trafia do niej rekord z informacją o ilości impulsów wody, gazu i prądu oraz ich koszcie,
- stany – w tej tabeli co minutę zapisywane są aktualne stany liczników.
Kody do utworzenia tabel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
CREATE TABLE `impulsy` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `czas` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `woda` CHAR(50) NULL DEFAULT '0' COLLATE 'utf8_polish_ci', `gaz` CHAR(50) NULL DEFAULT '0' COLLATE 'utf8_polish_ci', `prad` CHAR(50) NULL DEFAULT '0' COLLATE 'utf8_polish_ci', `koszt_woda` DOUBLE UNSIGNED NULL DEFAULT '0', `koszt_gaz` DOUBLE UNSIGNED NULL DEFAULT '0', `koszt_prad` DOUBLE UNSIGNED NULL DEFAULT '0', INDEX `ID` (`ID`) ) COLLATE='utf8_polish_ci' ENGINE=InnoDB AUTO_INCREMENT=11398 ; |
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE TABLE `stany` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `czas` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `woda` DOUBLE UNSIGNED NOT NULL DEFAULT '0', `gaz` DOUBLE UNSIGNED NOT NULL DEFAULT '0', `prad` DOUBLE UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`ID`) ) COLLATE='utf8_polish_ci' ENGINE=InnoDB AUTO_INCREMENT=11192 ; |
Skoro bazy danych są już gotowe, możemy przejść do zapisywania w nich danych.
Zapisywanie danych w bazie MySQL
Na początku tworzymy dwa pliki:
mysql.php – w tym pliku zapisujemy dane do łączenia z bazą danych:
1 2 3 |
<?php $link = mysqli_connect("localhost", "esp8266", "************", "liczniki"); if($link === false) {die("ERROR: Could not connect. " . mysqli_connect_error());} |
ceny.php – tutaj zapisałem sobie aktualne ceny wody, gazu i prądu:
1 2 3 4 5 6 7 8 9 10 |
<?php $woda_m3 = 11.75; $woda_l = $woda_m3/1000; $woda_imp = $woda_l; $gaz_m3 = 1.2602; $gaz_imp = $gaz_m3/100; $prad_kwh = 0.5386; $prad_imp = $prad_kwh/120; |
Na koniec pozostało już tylko utworzyć plik dodaj_prad.php, który będzie zapisywał dane wysyłane przez ESP (dla pozostałych liczników robimy analogicznie).
Uwaga – tego kodu, to już nawet amatorszczyzną nazwać nie można. Mam tego świadomość, więc możecie się za bardzo nie nabijać z tego kodu w komentarzach ;) Początkowo wyglądał nawet ładnie, czysto i przejrzyście, ale cały czas coś tam w nim grzebię, dodaję i poprawiam, więc mogło się wkraść trochę chaosu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
<?php require_once('mysql.php'); require_once('ceny.php'); $impulsyPrad = $_GET['impulsyPrad']; $stanPradu = $_GET['stanPradu']/1000; $kosztPradu = round($impulsyPrad*$prad_imp, 7); $teraz_od = date('Y-m-d H:i:s', mktime(date("H"), date("i"), 0, date("m") , date("d"), date("Y"))); $teraz_do = date('Y-m-d H:i:s', mktime(date("H"), date("i"), 59, date("m") , date("d"), date("Y"))); $q_teraz = "SELECT * FROM impulsy WHERE czas BETWEEN '$teraz_od' AND '$teraz_do'"; $result_teraz = mysqli_query($link, $q_teraz) or die("<br />Problemy z odczytem danych!"); if(mysqli_query($link, $q_teraz)){ if(mysqli_num_rows(mysqli_query($link, $q_teraz)) > 0) { echo "ID: "; while($row_teraz = mysqli_fetch_row($result_teraz)) { $aktualizacja_ID = $row_teraz[0]; echo $aktualizacja_ID; $query="UPDATE impulsy SET prad='$impulsyPrad', koszt_prad='$kosztPradu' WHERE ID='$aktualizacja_ID'"; if(mysqli_query($link, $query)) {echo "<br />Impulsy dopisane do rekordu ID: ".$aktualizacja_ID;} else {echo "<br />ERROR: Could not able to execute $sql. " . mysqli_error($link);} } } else { $sql = "INSERT INTO impulsy (prad, koszt_prad) VALUES ('$impulsyPrad', '$kosztPradu')"; if(mysqli_query($link, $sql)) {echo "<br />Impulsy zapisane w nowym rekordzie";} else {echo "<br />ERROR: Could not able to execute $sql. " . mysqli_error($link);} } } else {echo "<br />ERROR: Could not able to execute $sql. " . mysqli_error($link);} $q_teraz = "SELECT * FROM stany WHERE czas BETWEEN '$teraz_od' AND '$teraz_do'"; $result_teraz = mysqli_query($link, $q_teraz) or die("<br />Problemy z odczytem danych!"); if(mysqli_query($link, $q_teraz)){ if(mysqli_num_rows(mysqli_query($link, $q_teraz)) > 0) { echo "ID: "; while($row_teraz = mysqli_fetch_row($result_teraz)) { $aktualizacja_ID = $row_teraz[0]; echo $aktualizacja_ID; $query="UPDATE stany SET prad='$stanPradu' WHERE ID='$aktualizacja_ID'"; if(mysqli_query($link, $query)) {echo "<br />Impulsy dopisane do rekordu ID: ".$aktualizacja_ID;} else {echo "<br />ERROR: Could not able to execute $sql. " . mysqli_error($link);} } } else { $sql = "INSERT INTO stany (prad) VALUES ('$stanPradu')"; if(mysqli_query($link, $sql)) {echo "<br />Impulsy zapisane w nowym rekordzie";} else {echo "<br />ERROR: Could not able to execute $sql. " . mysqli_error($link);} } } else {echo "<br />ERROR: Could not able to execute $sql. " . mysqli_error($link);} mysqli_close($link); |
Działanie skryptu jest proste – przy wywołaniu zapytania GET z ESP8266 skrypt sprawdza, czy w danej minucie został już utworzony rekord z danymi czy nie. Jeżeli go nie ma, to go tworzy zapisując w bazie odczyty z danego licznika.
Jeżeli natomiast rekord już jest, bo np. kilka sekund wcześniej w bazie zapisały się odczyty z wodomierza, to dany rekord jest aktualizowany i są do niego dodawane odczyty z kolejnego licznika (w tym przypadku z licznika prądu).
I to wszystko – system już zbiera i zapisuje wszystkie dane.
Pliki STL do pobrania
- mocowanie kontaktronu do gazomierza ACTARIS GALLUS 2000
- mocowanie czujnika TCRT5000 do licznika prądu PAFAL TYP C52
Wykresy, wykresiki…
Na koniec została do zrobienia jeszcze warstwa wizualna. I to będzie materiał na kiedyś, bo tutaj jeszcze dużo zostało mi do zrobienia.
Zalążek warstwy wizualnej zacząłem już budować z pomocą biblioteki Chart.js, ale jest to dopiero wierzchołek góry lodowej tego, co chcę zrobić, więc na razie nie będę poruszał tego tematu :)
Na razie wygląda to tak:
Po kolei mamy tutaj:
- wykres zużycia mediów z ostatnich dwóch godzin,
- wykres zużycia z danego dnia,
- wykres zużycia z poprzedniego dnia,
- wykres zużycia z danego miesiąca (system działa dopiero kilka dni, więc jeszcze jest tam mało danych),
- roczne zestawienie wysokości rachunków z rozdzieleniem na poszczególne media.
Na pewno chcę zrobić jeszcze różnego rodzaju tabele z informacjami o wzroście zużycia względem poprzedniego okresu, prognozowanych wysokościach rachunków, itp. Ale to będę już sobie powoli dłubał i dopieszczał, a za jakiś czas podzielę się z Wami wszystkimi kodami.
I na dzisiaj to by było tyle. Mam nadzieję, że projekt się Wam przyda – jeżeli nie w całości, to może chociaż zaczerpniecie z niego jakieś rozwiązania.
Jeżeli macie jakieś uwagi lub komentarze, to piszcie śmiało!
Pozdrawiam!
Łukasz
Nie wyjaśniłeś najważniejszego – skąd to duże zużycie wody? ;)
Do tego jeszcze nie doszedłem ;)
Nie obawiasz się kłopotów z pracownikami Zakładu Energetycznego i gazowni?
W żaden sposób nie ingerowałem w liczniki ani ich plomby. Nie mam się czego obawiać.
“te pomarańczowe elementy to takie uchwyty z magnesikami”
Magnes przy liczniku może być potraktowany jako ingerencja…
Na wszelki wypadek przykleję to po prostu taśmą :)
Z tego co się dowiedziałem układ zliczający impulsy musi być wykonaniu iskrobezpiecznym i posiadać stosowny certyfikat zgodny z Dyrektywą Unijną ATEX (pomimo tego że nie ingerujesz w gazomierz).
Przecież nie ingerował w plomby czy też liczniki, więc w czym problem ?
jedno slowo: grafana :o)
Na pierwszy rzut oka ładne. Muszę się przyjrzeć bliżej :) Dzięki!
Licznik + magnesy = duży problem. Pewna kara. Poza tym spróbuj panu z ZE wytłumaczyć co to jest. Wg mnie żadnych szans.
Oj tam. Zaraz to przykleję taśmą klejącą i po problemie ;) Chociaż magnesy to i tak działały na wodomierze – i to tylko te starsze.
Poza tym – dlaczego w ogóle miałbym mu cokolwiek tłumaczyć? W żaden sposób nie ingerowałem w licznik, a jedynie świecę sobie na niego diodą podczerwoną.
Magnesy też działają na właśnie indukcyjne liczniki elektryczne, do taśmy raczej nikt się nie przyczepi. Ewentualnie każe to ściągnąć np przy wymianie licznika czy odczucie. Mówię to jako pracownik Tauronu :D
Chodzi mi o podejście pracowników tych firm. Przyjdzie, zobaczy dziwny sprzęt na liczniku i afera gotowa. Nie będzie dyskusji. Zrobi fotkę, napisze co uważa i koniec. Nie pogadasz. Wiem z własnego doświadczenia :(
Spoko. Zrobi fotkę, napisze co uważa, przekaże to komuś kto się zna i na tym się skończy.
Poza tym – już nie pamiętam, kiedy inkasenci widzieli moje liczniki. Nigdy im się nie chce iść do piwnicy i sam przekazuję im wskazania.
Twój cyrk itd. Pamiętaj, że licznik jest ich własnością. Dla Ciebie to tylko diody, dla niego to super-hiper urządzenie do zakłócania pracy licznika. Oni mają premie za znajdywanie “pajęczarzy”. Jakby co to uprzedzałem :)
Mam tego świadomość, że inkasent może się tym zainteresować, bo najzwyczajniej w świecie nie będzie wiedział co to jest i jak działa. Ale inkasent co najwyżej może przekazać sprawę wyżej do kogoś, kto już się będzie na tym znał :)
Dobra, nie ma już żadnych magnesików ;)
Projekt super, ale sprawdź czy przypadkiem nie ucieka Ci woda przez spłóczkę. Bardzo częsty przypadek.
To była pierwsza myśl i to była pierwsza rzecz jaką sprawdzałem. Ale ani w muszlach nie ma żadnego charakterystycznego rdzawego nalotu od cieknącej wody, ani licznik nawet nie drgnie gdy nikogo nie ma w domu.
Póki co zastanawiam się, czy to przypadkiem sam licznik nie zawyża pomiarów. Jutro pprzeleję kontrolowaną ilość wody przez wiadro z podziałką i zobaczę o ile ruszy się wskazanie na liczniku.
Ewentualnie jeszcze myślę nad dołożeniem drugiego licznika zaraz za tym głównym. Koszt znikomy, a mógłbym porównywać ich wskazania.
Woda – zwróć uwagę na wszystkie spłuczki. Miałem z tym duży problem. Mały, prawie niewidoczny wyciek – a ilość wody w okolicy 20m3/mc.
Projekt ciekawy, aż z czystej ciekawości spróbuję zbudować :)
Spłuczki raczej wykluczone. Zerknij na mój komentarz sprzed minuty: https://majsterkowo.pl/rejestrowanie-wskazan-licznikow-wody-gazu-i-pradu-opis-trzech-sposobow-zliczania-impulsow/#comment-123710
No tak :) jak pisałem, tego tam jeszcze nie było.
Przekłamanie licznika – realne.
Test – dobry pomysł.
Możesz wytłumaczyć jak działa ESP? W sensie nie korzystałeś z żadnego ESPEasy tylko normalnie wgrałeś kod jak w zwykłym Arduino? Co tutorial to każdy zaczyna od jakiegoś ESPEasy, Domoticza albo innego systemu. Nie ogarniam tego. :D
Tak – programujesz normalnie przez Arduino IDE. Tutaj masz tutorial, jak dodać ESP8266 do IDE: https://abc-rc.pl/Node-MCU-ESP8266-w-srodowisku-Arduino-IDE-blog-pol-1540975167.html
z magnesami uważaj w licznikach są takie paski które zmieniają kolor jak przyłożysz magnes np. http://bmeters.pl/pl/wskaznik_pola_mfi/79/ u mnie to sprawdzają jak robią kontrolny manualny odczyt (co miech odczytują radiowo)
Magnesów już nie ma :) To były takie malutkie pesteczki 4×4 mm, więc nie miały szans oddziaływać na na nic w liczniku, ale dla świętego spokoju przykleiłem czujnik taśmą zamiast tych magnesów.
czasem też używają czegoś takiego https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcQZQrw0wLgGf6v6TjWqnukhumkUkQlTScJ-77BZBUaUVNkpevkd
Podepnij czujniki do pralki, lodówki będziesz miał podgląd zużycia
Robiłem ręczne pomiary ile bierze pralka i zmywarka:
– pralka: 57 litrów
– zmywarka: 15 litrów
I sobie notujemy w kalendarzu kiedy puszczamy pranie i zmywarkę ;) Pod koniec miesiąca się podliczy i będę wiedział ile wody na to poszło.
Ukryj dobrze ten skrypt – jak wspomniałeś spora amatorszczyzna ;) ale ma poważne błędy SQL injection – najlepiej abyś wszystko co wchodzi z parametrów GET/POST filtrował nawet funkcją mysql_real_escape_string
Co racja to racja ;) Teoretycznie do serwera nie ma dostępu z zewnątrz, ale na wszelki wypadek trochę to zabezpieczę. Dzięki!
Łukasz pokaż zdjęcia Wemosa – jak to połączyłeś w rzeczywistości. Czy pakowałeś to w jakąś wydrukowaną obudowę?
Nie chciało mi się robić obudowy ;)
Tutaj na zdjęciu wemos od wodomierza i gazomierza (te dwa liczniki mam obok siebie, więc zrobiłem je na jednej płytce).
Przetwornicę STEP-DOWN upchnąłem pod wemosem.
A będę upierdliwy jeżeli poproszę jeszcze zdjęcie tej płytki od dołu? Jak łączysz “ścieżki”? ;)
Trzeci raz czytam i nie rozumiem. Ta baza MySQL też jest realizowana na ESP ?
Nie, baza jest na PC/Raspberry itp.
Jak można to zrobić z wysyłaniem na maila ?
Łukasz… mały błąd. Mam na imię Marcin a nie Marek ;) Fajnie że się przydały te czujniki…
Agh! A jeszcze specjalnie sprawdzałem na wizytówce, żeby się nie pomylić :P Wybacz! Już poprawiłem.
Cześć, czy można zastosować czujnik indukcyjny zamiast kontaktronu? Przy liczniku gazu? mam zestaw licznika impulsów z czujnikiem indukcyjnym
Świetny projekt. Dużo inspiracji. Skoro już śledzisz te liczniki to proponuję dodać alarm sms’owy, gdy na przykład w nocy (albo poodczas nieobecności) coś zacznie wodę w większych ilościach pobierać. Mam znajomych, u których w nocy pękł wężyk do baterii w umywalce i jak się obudzili wszystko już tonęło. Podaję przykład jak wysyłam sms’y z raspberry, gdy kamera wykryje ruch w nocy (między 0:00 a 6:00):
https://github.com/dominikdeka/motiondetect (niestety… kod zawiera kryptoreklamę firmy wysyłającej sms’y). Wysyłanie realizuje raspberry, które ‘gada’ z urządzeniami po MQTT, interesujący fragment to instrukcje dotyczące mProfi.
Pingback: Rejestrowanie wskazań liczników wody, gazu i prądu – opis trzech sposobów zliczania impulsów – Warsztatowe DIY
Witam.
W porze bumu na energię odnawialną z PV można byłoby wymyślić sterowanie zależne od prądu.
Chodzi mi załączanie obwodów dodatkowych w zależności od natężenia prądu np. 1A załącz pierwszą grzałkę, 2A załącz drugą grzałkę lub można to wykorzystać do załączenia klimy w mieszkaniu
Pozdrawiam. Nowy
Projekt bardzo ciekawy. Odnośnie bazy danych to moim zdaniem wystarczy zrobić jedną tabelę z jedną kolumną timestamp. Znając dokładny moment pojawienia się pojedynczego impulsu resztę można wyliczyć.
Oczywiście mam na myśli pomiar energii elektrycznej.
Czy ktoś testował podłączenie zwykłego kontaktronu do gazomierze Metrix Apator G4? Próbowałem już z kilkoma kontaktronami i nic. Dedykowany kontaktron (NI-3) kosztuje 60 zł więc rząd wielkości więcej niż kontaktron. Czy ten Ni-3 jest jakoś dużo bardziej czuły i magnesik na kole licznika nie wzbudza zwykłego kontaktronu?
Łukasz, masz chyba błąd w założeniach.
Napisałeś:
gazomierz: jeden impuls to 0,001 m3 gazu.
Moim zdaniem jest to 0,010 m3 gazu.