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
Elektroměr a jeho impulzní výstup.
Testovací verze skriptu - vyčítá to!
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()