import DomoticzEvents as DE
import json
from datetime import datetime
from datetime import date
import sys
if '/usr/lib/python3/dist-packages/' not in sys.path : #sjekker at path nødvendig for requests-modulen er tilstede og oppretter hvis nødvendig
DE.Log('Path not found')
sys.path.append('/usr/lib/python3/dist-packages/')
DE.Log('Path added')
#else:
#DE.Log('Pathfound')
import requests
currentDate = date.today()
currentTime = datetime.now()
currentHour = datetime.now().hour
priceLimit=1.4 #hvor du setter grensa mellom dyr og "billig" strøm
DE.Log("\nStrømpris-script kjørt\n")
#-------------SETUP COMPLETE-------------
def fetchPrices():
DE.Log("FETCHING PRICES FROM SERVER - current price will be updated on next pass")
response = requests.get(f"https://norway-power.ffail.win/?zone=NO1&date={currentDate}&key=SETT INN NØKKEL HER")
priceList=[]
for i in response.json():
priceContainer=response.json()[i]
priceList.append(priceContainer['NOK_per_kWh']) #henter ut den verdien jeg er interessert i og legger til lista
priceList.append(datetime.now().isoformat()) #legger nedlastingstidspunkt til slutten av prislista
with open("pricelist.json", 'w') as f:
json.dump(priceList, f, indent=2) #lagrer prislista til json-fil
#fetchPrices() #denne linja må kjøres kun én gang for å opprette json-fil, deretter kommenteres bort. VIKTIG at den kjøres kun én gang, ellers blir du fort blokkert fra serveren.
###------------Oppdater timepris fra lagret liste--------------------------
with open("pricelist.json", 'r') as f: #henter lagrede priser fra lokal json-fil
loadedPrices = json.load(f)
#DE.Log("loaded Prices:\n")
#DE.Log(loadedPrices)
hourPrice = loadedPrices[currentHour]
timeDelta= currentTime - datetime.fromisoformat(loadedPrices[24])
minutesDelta = round(timeDelta.total_seconds()/ 60)
DE.Log("Prisliste sist oppdatert")
DE.Log(str(minutesDelta))
DE.Log("minutter siden, det var nøyaktig:")
DE.Log(str(loadedPrices[24]))
DE.Log("\nPrisen denne timen er:")
DE.Log(str(hourPrice))
if currentHour == 0 and minutesDelta > 61 :
fetchPrices()
if hourPrice < priceLimit:
DE.Log("strømmen er relativt billig")
DE.Command( 'Billig', "On")
elif hourPrice > priceLimit:
DE.Log("strømmen er pissdyr, skru av ovnene")
DE.Command( 'Billig', "Off")
else:
DE.Log("her har det skjedd noe rart")
Koden til @alge gikk meg langt over hodet, så jeg laget min egen som jeg forstår. Sikkert veldig tungvint og barnslig kode, men det virker. Denne må lagres som en fil (for eksempel script_time_strømpris.py) og legges i domoticz/scripts/python - også må det opprettes en virtuell bryter som heter Billig. Den skrues av/på ut ifra om strømmen er billig eller dyr, og kan dermed brukes til å kontrollere andre ting uten å måtte surre noe mer med dette scriptet eller python om du ikke vil.
Knappen billig må opprettes, scriptet lagres på rett sted, legg inn din egen passkey, deretter må du fjerne en # foran første fetchprice() for at lokal json-fil skal opprettes. Viktig! Når skriptet er kjørt én gang må du sette # tilbake igjen å lagre, ellers vil den laste ned fra API en gang pr minutt - ikke bra. Alternativt kan du opprette filen manuelt, men jeg aner ikke hvor den skal ligge eller hvor filen blir opprettet....
Nye priser lastes ned hver dag rett over midnatt. Det første minuttet etter midnatt vil den kjøre på feil (gårsdagens) verdi - det kan jeg leve med. Hvis den ikke får svar eller noe galt skjer rundt nedlasting er jeg ikke sikker på hva som skjer. Mulig lokal json-fil blir korrupt og scriptet kræsjer. Eller kanskje den prøver igjen én gang pr minutt den første timen, for så å vente til neste dag. Dette er ikke helt som jeg skulle ønske (burde vært progressivt økende delay, men jeg har ikke kommet helt dit), men gitt at APIet virker henter den bare ut data én gang i døgnet.
Implementeringen/dokumentasjon av python for domoticz viste seg veldig mangelfull. Jeg har ikke klart å finne ut hvordan man sjekker status til en bryter, dermed blir "billig" skrevet til hvert minutt uansett status. Jeg ville normalt sjekket hvor den sto og bare flyttet den hvis i feil posisjon, men jeg har ikke klart å finne ut av det. Null problem om man bruker lua eller dzevents, men i python har jeg ikke klart å finne kommandoen for det. Også irriterende at kommandoen for å skrive til loggen ikke fungerer på samme måte som print. Den vil bare ha string og bare én om gangen. Så det blir noen ekstra linjeskift her og der, men det får gå. Jeg deler den her tilfelle det kan være til hjelp for noen.