Obsah

RPi zero - měření spotřeby z elektroměru

Princip

Pro vyčítání impulzů z elektroměru a jeho výstupu S0 je možné využít Raspberry Pi Zero. V mém případě je výstup zapojený do RPi Zero na PIN 23 - viz skript níže, kde je číslo PINu uvedené v nastavení.

Sám jsem použil elektroměr DTS353C. Neřeším jednotlivé fáze, i když TMEP má přípravu každou ze tří fází posílat jako samostatnou hodnotu (pokud je dokážete z jiného zařízení vyčítat samostatně). Informace o impulzním výstupu z manuálu k elektroměru:

Na TMEPu je potřeba mít založené čidlo typu Spotřeba a ve výchozí jednotce zvolit kWh. Po spuštění skriptu byste měli vyčítat impulzy - nezapomeňte na začátku skriptu upravit nastavení podle vás. V případě, že je vyčítání v pořádku nezapomeňte ve vašem OS nastavit spuštění skriptu po restartu systému.

Fotky z realizace

20221027-141908.jpeg
Elektroměr a jeho impulzní výstup.

20221027-141919.jpeg
Testovací verze skriptu - vyčítá to!

20221027-141930.jpeg
Test „na prasáka“, jestli to funguje.

20221027-141937.jpeg
Uhlazenější finále.

Skript pro vyčítání hodnot a jejich posílání na TMEP

read.py
#!/bin/python
 
# Testovano na Python 2.7 na RPi zero
 
# Vycitani impulzu z elektromeru pres rozhrani S0 do
# RPi zero a nasledne odeslani na TMEP.cz
#
# Vycitame hodnotu impulzy a delime poctem impulzu na kWh
# podle pouziteho elektromeru
#
# Pokud po vycteni impulzu uplynulo vice nez X minut od posledniho
# odeslani na server, tak posleme
 
# Nastaveni:
domena = str("spotreba.tmep.cz")
prepocetImpulzuNakWh = float(800)
pinNaRPI = int(23)
odeslatKazdychMinut = int(5)
 
import time
import RPi.GPIO as GPIO
import requests
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(pinNaRPI, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
 
# INIT
citacImpulzu = int(0)
casOdeslani = time.time()
 
# Vycitaci smycka
while True:
    GPIO.wait_for_edge(pinNaRPI, GPIO.RISING)
    citacImpulzu += 1
    print citacImpulzu/prepocetImpulzuNakWh, "kWh"
    GPIO.wait_for_edge(pinNaRPI, GPIO.FALLING)
 
    dobaOdOdeslani = time.time() - casOdeslani
 
    # Ubehl cas, kdy chceme odesilat na server?
    if dobaOdOdeslani > (odeslatKazdychMinut * 60):
        try:
            r = requests.get("http://" + domena  + "/?kwh=" + str(citacImpulzu/prepocetImpulzuNakWh))
            r.raise_for_status()
            if r.status_code == 200:
                citacImpulzu = 0
                casOdeslani = time.time()
                print("Uspesne odeslano na " + domena)
            else:
                # Nepovedlo se odeslat? Priste to zkusime nejdriv za minutu
                casOdeslani += 60
                print("Nepodarilo se odeslat na " + domena + ", zkusim to znovu za minutu, info:")
                print "Status: ", r.status_code
                print "Headers: ", r.headers
                print "Content: ", r.content
        except requests.exceptions.RequestException as err:
            print ("OOps: Something Else",err)
            casOdeslani += 60
        except requests.exceptions.HTTPError as errh:
            print ("Http Error:",errh)
            casOdeslani += 60
        except requests.exceptions.ConnectionError as errc:
            print ("Error Connecting:",errc)
            casOdeslani += 60
        except requests.exceptions.Timeout as errt:
            print ("Timeout Error:",errt)     
            casOdeslani += 60
GPIO.cleanup()