Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Flow til IKEA Fyrtur rullegardin


AndersO

Anbefalte innlegg

Har en flow som kjører gardinen ned når LUX i rommet blir over 200 (Basert på Fibaro motion sensor), og en annen flow som kjører den opp igjen når LUX blir mindre enn 199.

Funker fint det, men hvordan hindrer jeg den i å gå opp og ned som en jojo når LUXen er akkurat i grenseland? dvs når gardinen går ned, så blir LUXen under 199 og den går opp igjen. Da blir LUXen over 200 og den går ned. Slik går nu dagan....

 

Noen forslag?

Kanskje en sjekk mot tid? At gardinen må ha vært nede i minst en time før den kan gå opp igjen?

Har ingen anelse om hvordan det settes opp i såfall.

Lenke til kommentar
Del på andre sider

Med kun en lux i forskjell så er det ulempen. Det enkleste er å si ned på 200 og opp på f.eks. 150 (her kan du teste ut hva som passer best).

 

Eventuelt at du går inn med en minimumstid som man skal holde endringen før det kan komme en ny endring. Jeg kjenner ikke dine enheter godt nok til å si hvordan du kan gjøre det i de.

Lenke til kommentar
Del på andre sider

Jeg har lagd det slik at når de først går ned så står de slik i minimum 8 timer hvis ingen er hjemme eller i 2 timer hvis noen er hjemme. At de skal gå opp og ned etterhvert som skyene driver forbi, er ikke bra.

Lenke til kommentar
Del på andre sider

2 timer siden, stigvi skrev:

Jeg har lagd det slik at når de først går ned så står de slik i minimum 8 timer hvis ingen er hjemme eller i 2 timer hvis noen er hjemme. At de skal gå opp og ned etterhvert som skyene driver forbi, er ikke bra.

Det var noe sånt jeg tenkte på også. 

Er det på Homey? Kunne jeg i såfall tatt en titt på den flowen? 

 

Lenke til kommentar
Del på andre sider

1 time siden, stigvi skrev:

Nei, det er skrevet i python for Home Assistant. Men kan dele hvis du fortsatt er interessert

Ja takk, gjerne. Kan jo hende det går opp et lys 😄

Lenke til kommentar
Del på andre sider

10 timer siden, AndersO skrev:

Ja takk, gjerne. Kan jo hende det går opp et lys 😄

Konfigurasjon for en av gardinene:

 

gardiner:
        - id: hagestue_oest
          navn: Hagestue øst
          retning: 138.6
          sollysnivaa: 27000
          forsinkelse_borte: 18000
          forsinkelse_hjemme: 7200
          gardin: cover.rullegardin_hagestue_oest
          vindu: binary_sensor.glassdor_a
          sollyssensors: sensor.lysstyrke_filtrert
          elevation: 5
          azimuth_morgen: 10
          azimuth_kveld: 10
          borteposisjon: 0
          hjemmeposisjon: 40
          overstyr: input_select.modus_gardin_terrasse
          bryter: gardin_bryter
          event_auto: 1002
          event_alltid_oppe: 2002
          event_halvveis_nede: 3002
          delay: 2



Kode:

 

import time

registered_triggers = []
factory_apps = []

@time_trigger('startup')
def gardinstartup():
    for app in pyscript.app_config:
        factory_apps.append(Gardiner(app))

class Gardiner:
    Status_OPPE = 1
    Status_HALVVEIS = 2
    Status_LUKKET = 3
    Status_UKJENT = 4
    Status_MANUELL = 5
    Type_IKEA = 1
    Type_LUXAFLEX = 2
    Type_UKJENT = 3
    isSun = False
    isInPosition = False
    type = Type_UKJENT
    cfg = None

    def __init__(self, config):
        self.cfg = config
        state.persist(f"pyscript.gardin_{self.cfg['id']}_twls", default_value=0)
        state.persist(f"pyscript.gardin_{self.cfg['id']}_status", default_value=self.Status_OPPE)

        if "gardin" in self.cfg:
            self.type = self.Type_IKEA
        elif "scene_oppe" in self.cfg and "scene_lukket" in self.cfg and "scene_halvveis" in self.cfg:
            self.type = self.Type_LUXAFLEX

        if float(sun.sun.elevation) >= float(self.cfg['elevation']):
            if float(sun.sun.azimuth) >= float(self.cfg['retning'] - 90 + self.cfg['azimuth_morgen']):
                if float(sun.sun.azimuth) <= float(self.cfg['retning'] + 90 - self.cfg['azimuth_kveld']):
                    self.isInPosition = True

        f = int(self.cfg['forsinkelse_borte'])

        if binary_sensor.noen_er_hjemme == "on":
            f = int(self.cfg['forsinkelse_hjemme'])
        
        if time.time() - float(state.get(f"pyscript.gardin_{self.cfg['id']}_twls")) < f:
            self.isSun = True

        @state_trigger(f"{self.cfg['sollyssensors']}", state_hold = self.cfg['delay'])
        def sollys_trig():
            self.sollys()
        registered_triggers.append(sollys_trig)
                
        @state_trigger("sun.sun.azimuth", state_hold = self.cfg['delay'])
        def sun_trig():
            self.sun()
        registered_triggers.append(sun_trig)
        
        @state_trigger(f"{self.cfg['overstyr']}", state_hold = self.cfg['delay'])
        def nystatus_trig():
            self.nystatus()
        registered_triggers.append(nystatus_trig)

        @event_trigger("deconz_event")
        def bryter_trig(context, device_id, event_type, trigger_type, unique_id, id=None, event=None):
            self.bryter(id, event)
        registered_triggers.append(bryter_trig)

        if "vindu" in self.cfg:
            @state_trigger(f"{self.cfg['vindu']}")
            def nystatusvindu_trig():
                self.nystatus()
            registered_triggers.append(nystatusvindu_trig)

        if int(state.get(f"pyscript.gardin_{self.cfg['id']}_status")) == self.Status_HALVVEIS:
            state.set(f"sensor.gardin_status_{self.cfg['id']}", value = f"{self.cfg['navn']} er halvveis lukket")
        elif int(state.get(f"pyscript.gardin_{self.cfg['id']}_status")) == self.Status_LUKKET:
            state.set(f"sensor.gardin_status_{self.cfg['id']}", value = f"{self.cfg['navn']} er lukket")
        else:
            state.set(f"sensor.gardin_status_{self.cfg['id']}", value = "")

        state.set(f"sensor.gardin_sollysnivaagrense_{self.cfg['id']}", value = self.cfg['sollysnivaa'])

    def sun(self):
        self.isInPosition = False

        if float(sun.sun.elevation) >= float(self.cfg['elevation']):
            if float(sun.sun.azimuth) >= float(self.cfg['retning'] - 90 + self.cfg['azimuth_morgen']):
                if float(sun.sun.azimuth) <= float(self.cfg['retning'] + 90 - self.cfg['azimuth_kveld']):
                    self.isInPosition = True

        self.sett_posisjon()

    def nystatus(self):
        self.sett_posisjon()
    
    def sollys(self):
        try:
            if self.isInPosition == True and float(state.get(self.cfg['sollyssensors'])) >= float(self.cfg['sollysnivaa']):
                state.set(f"pyscript.gardin_{self.cfg['id']}_twls", value = time.time())

                if self.isSun == False:
                    self.isSun = True
                    #self.log("sollys er paa")
                    self.sett_posisjon()
            else:
                f = int(self.cfg['forsinkelse_borte'])

                if binary_sensor.noen_er_hjemme == "on":
                    f = int(self.cfg['forsinkelse_hjemme'])

                if self.isSun == True and time.time() - float(state.get(f"pyscript.gardin_{self.cfg['id']}_twls")) > f:
                    self.isSun = False
                    self.sett_posisjon()
            
        except Exception:
            pass

    def sett_posisjon(self):
        try:
            g = self.Status_OPPE
    
            if self.type == self.Type_IKEA:
                pos = int(self.cfg['borteposisjon'])
    
                if binary_sensor.noen_er_hjemme == "on":
                    pos = int(self.cfg['hjemmeposisjon'])
    
            if self.isSun == True and self.isInPosition == True:
                g = self.Status_LUKKET
            
            if state.get(self.cfg['overstyr']) == "Alltid oppe":
                g = self.Status_OPPE
                self.isSun = False
            elif state.get(self.cfg['overstyr']) == "Helt nede":
                g = self.Status_LUKKET
                self.isSun = False
                
                if self.type == self.Type_IKEA:
                    pos = int(self.cfg['borteposisjon'])
                
            elif state.get(self.cfg['overstyr']) == "Halvveis nede":
                g = self.Status_HALVVEIS
                self.isSun = False
    
                if self.type == self.Type_IKEA:
                    pos = int(self.cfg['hjemmeposisjon'])
                
            elif state.get(self.cfg['overstyr']) == "Manuell":
                g = self.Status_MANUELL
                self.isSun = False
            
            if "vindu" in self.cfg and state.get(self.cfg['vindu']) == "on":
                g = self.Status_OPPE
                self.isSun = False
                
            #log.info(f"Gardin {self.cfg['navn']} settes til = {g}")
            
            if g != self.Status_MANUELL:
                if self.type == self.Type_IKEA:
                    if g != self.Status_OPPE and abs(float(state.get(f"{self.cfg['gardin']}.current_position")) - pos) > 2:
                        state.set(f"sensor.gardin_status_{self.cfg['id']}", value = f"{self.cfg['navn']} er lukket")
                        cover.set_cover_position(entity_id = self.cfg['gardin'], position = pos)
                        state.set(f"pyscript.gardin_{self.cfg['id']}_status", value = self.Status_LUKKET)
                    elif g == self.Status_OPPE and float(state.get(f"{self.cfg['gardin']}.current_position")) < 99:
                        state.set(f"sensor.gardin_status_{self.cfg['id']}", value = "")
                        cover.set_cover_position(entity_id = self.cfg['gardin'], position = 100)
                        state.set(f"pyscript.gardin_{self.cfg['id']}_status", value = self.Status_OPPE)
                elif self.type == self.Type_LUXAFLEX:
                    if g == self.Status_LUKKET and int(state.get(f"pyscript.gardin_{self.cfg['id']}_status")) != self.Status_LUKKET:
                        state.set(f"sensor.gardin_status_{self.cfg['id']}", value = f"{self.cfg['navn']} er lukket")
                        scene.turn_on(entity_id=self.cfg['scene_lukket'])
                        state.set(f"pyscript.gardin_{self.cfg['id']}_status", value = self.Status_LUKKET)
                    elif g == self.Status_OPPE and int(state.get(f"pyscript.gardin_{self.cfg['id']}_status")) != self.Status_OPPE:
                        state.set(f"sensor.gardin_status_{self.cfg['id']}", value = "")
                        scene.turn_on(entity_id=self.cfg['scene_oppe'])
                        state.set(f"pyscript.gardin_{self.cfg['id']}_status", value = self.Status_OPPE)
                    elif g == self.Status_HALVVEIS and int(state.get(f"pyscript.gardin_{self.cfg['id']}_status")) != self.Status_HALVVEIS:
                        state.set(f"sensor.gardin_status_{self.cfg['id']}", value = f"{self.cfg['navn']} er halvveis lukket")
                        scene.turn_on(entity_id=self.cfg['scene_halvveis'])
                        state.set(f"pyscript.gardin_{self.cfg['id']}_status", value = self.Status_HALVVEIS)
        except Exception:
            pass
    
    def bryter(self, id=None, event=None):
        try:
            #self.log('Bryter id: {} og event {}'.format(data['id'], data['event']))
            if "bryter" in self.cfg and id == self.cfg['bryter'] and event == int(self.cfg['event_alltid_oppe']):
                state.set(f"pyscript.gardin_{self.cfg['id']}_status", value = self.Status_UKJENT)
                input_select.select_option(entity_id = self.cfg['overstyr'], option = "Alltid oppe")
            elif "bryter" in self.cfg and id == self.cfg['bryter'] and event == int(self.cfg['event_halvveis_nede']):
                state.set(f"pyscript.gardin_{self.cfg['id']}_status", value = self.Status_UKJENT)
                input_select.select_option(entity_id = self.cfg['overstyr'], option = "Halvveis nede")
            elif "bryter" in self.cfg and id == self.cfg['bryter'] and event == int(self.cfg['event_auto']):
                state.set(f"pyscript.gardin_{self.cfg['id']}_status", value = self.Status_UKJENT)
                self.isSun = False
                input_select.select_option(entity_id = self.cfg['overstyr'], option = "Auto")
                
                if(float(state.get(self.cfg['sollyssensors'])) >= float(self.cfg['sollysnivaa'])):
                    self.isSun = True
        except Exception:
            pass

 

Lenke til kommentar
Del på andre sider

Ville heller satt på en timer via countdown/timer plugin. Hørt at den innebygde utsettelsen kan være litt "vanskelig" å ha med å gjøre. Alternativt sette tidsintervall "alle" 30min/60 min og sjekk lux er over under?


Sent from my iPhone using Tapatalk

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.