Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  7 3394
Siden jeg bor litt for langt sør i landet er det sjeldent jeg får med meg de få gangene det er nordlys som strekker seg helt ned hit, derfor har jeg satt sammen en liten kodesnutt (med litt veiledning fra folk på Stack Overflow) som gir meg nordlysvarsel (1 og 4 timers varsel) i Domoticz.

KP indexen bør ligge på 4-5 for at man skal kunne se det helt sør landet

Opprett 2 "custom sensor" i Domoticz og fyll inn IDX-en fra disse i koden sammen med ip og port til domoticz serveren din.
Jeg har lagt scriptet til i crontab med kjøring hver 15. minutt siden varslene oppdateres hvert kvarter.

Jeg er ingen programmerer så koden kan bære preg av dette, men den funker hvertfall slik den skal.


Kode

# coding: utf-8

import urllib.request
import requests

domoticz = 'http://0.0.0.0:8080' #Domoticz http://IP:PORT
idx1 = 'XX' #1 time varsel
idx4 = 'XX' #4 timer varsel

req = urllib.request.Request('http://services.swpc.noaa.gov/text/wing-kp.txt')
with urllib.request.urlopen(req) as response:
   kp = response.readlines()
   data1 = [i for i in str(kp[-1]).strip().split(" ") if i != ''][-7]
   data4 = [i for i in str(kp[-1]).strip().split(" ") if i != ''][-2]

print (data1, data4)

def updateValue(idx4, data4): #4 timers varsel
    url = domoticz + '/json.htm?type=command&param=udevice&idx='
    url += idx4 + '&nvalue=0&svalue=' + data4

    session = requests.Session()
    response = session.get(url)
    print(response)

def updateValue2(idx1, data1): #1 time varsel
    url = domoticz + '/json.htm?type=command&param=udevice&idx='
    url += idx1 + '&nvalue=0&svalue=' + data1

    session = requests.Session()
    response = session.get(url)
    print(response)

updateValue(idx1, data1)
updateValue2(idx4, data4)
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Fiffig! Vet ikke om det er noe vits i å bruke denne i Oslol, men interessant likevel.

Kodemessige tips: updateValue og ~2 er bokstavelig talt identiske fra det jeg kan se. Du kan fjerne ~2, eneste forskjellen på dem er navnene på variablene. Disse overskygger uansett de andre variablene med samme navn (som i seg selv bør unngås) og blir tilført når du kaller metodene i L34:35.
Takk for tipset om at domoticz eksisterer!
Ellers kan du i tillegg til tipset til robhol kutte ut urllib og bruke requests til å hente sida også.

bytt ut:

Kode

req = urllib.request.Request('http://services.swpc.noaa.gov/text/wing-kp.txt')
with urllib.request.urlopen(req) as response:
   kp = response.readlines()
med:

Kode

req = requests.get('http://services.swpc.noaa.gov/text/wing-kp.txt')
kp = req.text.split("\n")
Forbehold: har ikke testa
Men greit å spare seg for unødvendige imports
Sitat av robhol Vis innlegg
Fiffig! Vet ikke om det er noe vits i å bruke denne i Oslol, men interessant likevel.

Kodemessige tips: updateValue og ~2 er bokstavelig talt identiske fra det jeg kan se. Du kan fjerne ~2, eneste forskjellen på dem er navnene på variablene. Disse overskygger uansett de andre variablene med samme navn (som i seg selv bør unngås) og blir tilført når du kaller metodene i L34:35.
Vis hele sitatet...
Offtopic: Men før så jeg aldri nordlys i sørnorge. Men etter å ha bodd i Tromsø i 6 år og så flytte tilbake til sør har jeg minst sett nordlys 2-3 ganger i året. Så det er absolutt verd å bruke også i Oslo. Kanskje spesielt i Oslo siden det ikke er så ofte... men det skjer Hadde vi bare hatt mindre drittvær...
Sitat av robhol Vis innlegg
Fiffig! Vet ikke om det er noe vits i å bruke denne i Oslol, men interessant likevel.

Kodemessige tips: updateValue og ~2 er bokstavelig talt identiske fra det jeg kan se. Du kan fjerne ~2, eneste forskjellen på dem er navnene på variablene. Disse overskygger uansett de andre variablene med samme navn (som i seg selv bør unngås) og blir tilført når du kaller metodene i L34:35.
Vis hele sitatet...
Takk for tips
Som etse er inne på så er tanken min at jeg vil kunne få varsel de få gangene i året man faktisk kan se nordlys her nede.

Hvordan ser det ut nå da?

Kode

def updateValue(idx1, data1, idx4, data4): #post JSON til domoticz
    url1 = domoticz + '/json.htm?type=command&param=udevice&idx='
    url1 += idx1 + '&nvalue=0&svalue=' + data1
    
    url4 = domoticz + '/json.htm?type=command&param=udevice&idx='
    url4 += idx4 + '&nvalue=0&svalue=' + data4

    session = requests.Session()
    response1 = session.get(url1)
    response4 = session.get(url4)
    print(response1, response4)

updateValue(idx1, data1, idx4, data4)
Sitat av snuskatten Vis innlegg
Takk for tipset om at domoticz eksisterer!
Ellers kan du i tillegg til tipset til robhol kutte ut urllib og bruke requests til å hente sida også.

bytt ut:

Kode

req = urllib.request.Request('http://services.swpc.noaa.gov/text/wing-kp.txt')
with urllib.request.urlopen(req) as response:
   kp = response.readlines()
med:

Kode

req = requests.get('http://services.swpc.noaa.gov/text/wing-kp.txt')
kp = req.text.split("\n")
Forbehold: har ikke testa
Men greit å spare seg for unødvendige imports
Vis hele sitatet...
Fikk tips om akkurat det samme på stack overflow men fikk bare en feilmelding, var midt oppe i noe akkurat da så fikk aldri sjekket hva som utløste feilen men skal ta en titt på det.
Sist endret av Cybergasm; 10. februar 2017 kl. 23:48. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Jeg ville sagt at den updateValue-metoden burde blitt kalt to ganger og bare hatt ett sett med parametere, dvs updateValue(idx1, data1); updateValue(idx4, data4). Det gir mer mening å kalle en metode to ganger enn å gjøre to nesten identiske ting inni metoden.

Du kan også vurdere å bruke string interpolation (om jeg husker rett er man ikke så glad i string + string + string etc i Python-verdenen) når du bygger URLen.
Hadde slikt å gjøre, så jeg fikla litt til med koden din etter robhol sitt forslag.

Kode

def updateValue(id, data): #post JSON til domoticz
    url = '{}/json.htm?type=command&param=udevice&idx={}&nvalue=0&svalue={}'.format(domoticz, id, data)
    session = requests.Session()
    response = session.get(url)
    print(response)

updateValue(idx1, data1)
updateValue(idx4, data4)
Her er funksjonen generalisert, og du kaller den med de ulike variablene to ganger. Funksjonen aner ikke om den lager 1 eller 4 timers varsel, og det trenger den ikke vite heller
Måten url stringen blir bygd på nå er at {} blir erstatta med verdiene som blir passa i formatfunksjonen.

Hva bruker du av hardware til domoticzopplegget ditt?
Sitat av snuskatten Vis innlegg
Hadde slikt å gjøre, så jeg fikla litt til med koden din etter robhol sitt forslag.

Her er funksjonen generalisert, og du kaller den med de ulike variablene to ganger. Funksjonen aner ikke om den lager 1 eller 4 timers varsel, og det trenger den ikke vite heller
Måten url stringen blir bygd på nå er at {} blir erstatta med verdiene som blir passa i formatfunksjonen.

Hva bruker du av hardware til domoticzopplegget ditt?
Vis hele sitatet...
Takk
Det så litt mer ryddig ut.

Jeg bruker en Raspberry Pi 2 til Domoticz, det begynner å balle litt på seg så jeg har koblet til en Aeotec gen 5 Zwave usb stick og tellstick DUO for å styre zwave og 433mhz brytere.
Jeg har også en MySensors gateway koblet til samme RPi som hovedsaklig kommuniserer med DIY prosjekter som WS2812 hagelys, støvsensor, temperatursensorer, "clapper", IKEA LED table mm.
I tillegg har jeg ett par ESP-er som kommuniserer med Domoticz via MQTT (mosquitto).
Jeg har også Hyperion koblet til samme RPi som er en DIY ambilight klone til tv-en.