wtorek, 27 czerwca 2017

Licznik błyskawic w Domoticz. Wpis nieaktualny - serwis nie działa.

Dzień dobry!

Dzisiaj kolejny skrypt w stylu 'nie jest mi to do niczego potrzebne, ale skoro można, to czemu nie'...

Ponownie, korzystając z uprzejmości użytkowników forum Domoticz, skonfigurowałem i uruchomiłem program, który odczytuje ze strony ilość wyładowań atmosferycznych w zadanym dystansie.

Edytowane: niestety strona www.onweerdetectie.com nie udostępnia informacji o błyskawicach. Zostawiam jednak wpis, może komuś się przyda do nauki Pythona.

Instalacja i konfiguracja jest prosta i szybka. W sumie jedyne co musimy zrobić, to założyć wirtualny czujnik (czyli najpierw zakładka hardware, później Create Virtual Sensors).



Ważne jest, aby skonfigurować zmienne server, port, deviceIdx, distanceRange. Jeżeli w Domoticz macie skonfigurowane koordynaty GPS, skrypt je stamtąd pobierze. Jeśli nie - trzeba je podać ręcznie. Moim zdaniem jednak i tak są potrzebne, aby mieć informację o wschodach/zachodach słońca.

Poniżej skrypt do wklejenia i zmiany:

# Following libraries in python are needed : json, yaml,math,time,requests
# This script will load an external json file that contact for europe the lightning information and will send it to Domoticz when it's
# inside the distance range

import math
import requests
import json
import os
from datetime import datetime

# Domoticz server settings
server = "http://192.168.1.200"
port = 80
deviceIdx = 154

# Location to import the lightning info
jsonUrl = "http://www.onweerdetectie.com/domoticz_bo.json"

# GPS location and distance to calculate
#latHome = xx.xxxxxx
#lngHome = xx.xxxxxx
distanceRange = 10  # Distance in km

# Try to get GPS location from domoticz
try:
    data = json.loads(
        requests.get(
            "%s:%d/json.htm?type=settings" %
            (server, port)).content)
    latHome = float(data['Location']['Latitude'])
    lngHome = float(data['Location']['Longitude'])
except:
    pass


# Location distance calculation

def distance(lat1, lng1, lat2, lng2):
    radius = 6371

    dLat = (lat2 - lat1) * math.pi / 180
    dLng = (lng2 - lng1) * math.pi / 180

    lat1 = lat1 * math.pi / 180
    lat2 = lat2 * math.pi / 180

    val = math.sin(dLat / 2) * math.sin(dLat / 2) + math.sin(dLng / 2) * \
        math.sin(dLng / 2) * math.cos(lat1) * math.cos(lat2)
    ang = 2 * math.atan2(math.sqrt(val), math.sqrt(1 - val))
    return radius * ang

last = 0
if os.path.exists("/tmp/last_lightning.txt"):
    f = open("/tmp/last_lightning.txt")
    last = int(f.read())
    f.close()

z = requests.get(jsonUrl)
data = json.loads(z.content)
value = 0
ignored = 0
for pos in data:
    time_, lat, lng = pos
    distanceBetween = distance(latHome, lngHome, lat, lng)
    if (distanceBetween <= distanceRange):
        if (time_ > last):
            value += 1
        else:
            ignored += 1

f = open("/tmp/last_lightning.txt", "w")
f.write(str(time_))
f.close()

print ("Found %d matches -- %s" %
       (value, datetime.strftime(datetime.now(), "%c")))
print ("%d old matches were ignored -- %s" %
       (ignored, datetime.strftime(datetime.now(), "%c")))

requests.get("%s:%d/json.htm?type=command&param=udevice&idx=%s&svalue=%d" % (server, port, deviceIdx, value))

Ja zapisałem go w /home/pi/domoticz/scripts/python/lightning.py

Później wpis do cron, wygodniej było mi go uruchamiać co 15 minut.

crontab -e

*/15 * * * * sudo python /home/pi/domoticz/scripts/python/lightning.py

Działa, cieszy.


2 komentarze:

  1. Niestety serwer http://www.onweerdetectie.com/domoticz_bo.json już nie działa... skrypt też nie.

    OdpowiedzUsuń
    Odpowiedzi
    1. Tak, zgadza się. Nawet sprawdzałem to jakieś dwa tygodnie temu, bo miałem cały czas czerwony kafelek w Domoticz. Tak to jest, gdy korzysta się z zewnętrznych serwisów. Nawet Weather Underground z końcem roku kończy wsparcie dla API i trzeba będzie przerabiać wiele skryptów.

      Dziękuję za przypomnienie, zaktualizuję wpis.

      Usuń