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

stigvi

Medlemmer
  • Innlegg

    2 609
  • Ble med

  • Besøkte siden sist

  • Dager vunnet

    136

Innlegg skrevet av stigvi

  1. SveinHa skrev (15 minutter siden):

    Nøyaktig samme grunn til at jeg ga opp HomeSeer selv om HS har en for så vidt grei gruppering.

    Når det gjelder Home Assistant så er det neppe snakk om "hvis", men "når" de får en bedre måte å organisere dette på så kommer jeg selv til å gjøre om mange av mine python skript til Home Assistant automasjon.

    Dette er typisk å slå på radio via Sonos når noen kommer hjem etter at huset har stått tomt. Det er en python funksjon på 4 linjer

     

    @state_trigger("binary_sensor.noen_er_hjemme == 'on' and binary_sensor.noen_er_hjemme.old == 'off'")
    def somebodygothome():
        media_player.stue.select_source(source = "NRK P1 Rogaland")
        media_player.volume_set(volume_level = 0.3, entity_id = "all")


    og lages like enkelt i HA sin automasjon. Grunnen til at jeg ikke har gjort det er altså at det blir for mange slik små snutter. I pyscript kan jeg organisere det i mapper.

    image.png.022e5049824d730ae87fbb036038b84c.png

    Venin skrev (6 minutter siden):

    Hvilken oversikt er det du trenger egentlig? Jeg har inndelt alle mine med prefiks for rommet hvor automasjonen utføres (så langt det lar seg gjøre). Og søkefunksjonen finner jo alt så lenge man har gode navn på automasjonene.

    Ja, navneprefiks vil sannsynligvis løse det for meg også. Men jeg har tid til å vente enda litt til for å se om det kommer en grei måte å organisere det på.

    • Like 1
  2. Det finnes en mellomløsning hvis en synes HA sine automasjoner er "dårlige" og heller ikke har lyst til å bruke node-red.

    Jeg selv er der. HA automasjoner er forsåvidt greie nok, men når en har hundrevis så mister en oversikten i HA sin flate automasjonsliste. Det går ikke å kategorisere dem eller plassere de i mapper. Men jeg synes allikevel en får til det meste. For meg er det oversikten det skorter på.

    Jeg jobber med programmering så for meg var det helt naturlig å ta i bruk pyscript, https://github.com/custom-components/pyscript
    Denne er langt mer lettvekt enn å gå for node-red, men programmering er lite brukervennlig hvis en ikke har erfaring fra før med det.

  3. Jeg fikk vel egentlig svar på det jeg lurte på. Jeg sliter med at amsleser ikke alltid får med seg kwh-teller oppdatering som sendes hver time. Jeg har nettopp byttet til en PowU fra en egenlagd og det samme problemet skjer på begge.

    Det som skjedde var at den kontinuerlige telleren for dagsforbruk gikk ned ca 4kWh kl 10:00 og så spratt den opp ca 4kWh klokken 11:00. En ser hoppet mellom melding 49 og 50 nedenfor. Da tyder det på at dagsforbruket er basert på en integrasjon siste time og at resten av døgnets timer er på grunnlag av målerstand.

    Det gjør det uansett svært vanskelig å bruke Energy Dashboard i HA. Jeg må egentlig mekke i hop et eller annet selv som tar høyde for at data mangler.

    image.png.2711efec93be565e82e246d0afe55f85.png

  4. @gskjold

    For meg er det et lite problem at jeg ikke vet hvordan amsleser kommer fram til dagsforbruket. Jeg ser av timeforbruket at de integrerer opp ved å bruke Riemann summering med "right" som innverdi. Jeg har testet litt med Riemann summering direkte i HA og ser at resultatet av integreringen blir mer nøyaktig med "middle" (eller trapezoidal) innverdi. Har planer om å skrive en feature request og spørre om de kan endre fra "right" til "middle" for å bedre nøyaktigheten.

    Når det gjelder dagsforbruket som oppdateres "kontinuerlig", er det da en integrering i 24 timer eller er det integrering i 1 time pluss rapporterte målerverdier fra måleren i de foregående timene. Jeg har kikket bittelitt i koden, men fant det ikke. Hvis de integrerer i 24 timer, ser jeg for meg at dette tallet avviker en del fra det reelle når det nærmer seg slutt på døgnet.

  5. kodax skrev (10 timer siden):

    noe som virker som en merkelig begrensning

    Det er vel ment som en frostsikring og i så fall ikke merkelig i det hele tatt. Jeg innbiller meg at det er ganske vanlig å begrense til 5-7 grader.

  6. Jeg fant ut jeg ville gjøre noe med dette selv og her er min løsning:

    Jeg har laget en mal-sensor som dette
     

    template:
      - trigger:
          - platform: time_pattern
            minutes: 59
            seconds: 55
        sensor:
          - unique_id: d0edb519-03b2-4848-9b86-ac39bb4d5a90
            name: klepp_energi_total_energi_denne_time
            state_class: total_increasing
            unit_of_measurement: kWh
            device_class: energy
            state: "{{ (float(states('sensor.klepp_energi_total_energi')) + float(states('sensor.energy')))|round(3) }}"


    Så har jeg satt opp energy dashboard til å bruke denne nye sensoren.
     

    Det som skjer er at 5 sekund før hver hele time blir denne sensoren satt til forrige times kWh teller som rapportert i fra måleren pluss timesforbruk som min HAN leser genererer ut i fra effekt som den integrerer opp. Jeg bruker amsleser. Jeg mener Tibber Pulse også har denne, men er ikke helt sikker. Uansett kan du bruke Home Assistant sin "Integration - Riemann sum integral" til å beregne den.

    Løsningen har en svakhet. Det blir ikke helt nøyaktig. Litt skyldes at jeg mangler 5 sekund og litt skyldes at amsleser ikke er helt nøyaktig. Men avviket er stort sett innenfor 10-20Wh. Det er ikke mye og for meg en bedre løsning enn å ha en graf som er forskjøvet. Det positive er at integreringen starter på null hver time så en eventuell feil blir ikke summert opp gjennom hele døgnet.

    Dette skrev jeg 12:40 og siste time i grafen er for 11:00 til 12:00
    image.png.79fd51f093a63ebcd5d6391dc41f750f.png

  7. minim skrev (10 timer siden):

    Trodde dette fungerte slik at de automatisk fant router tilgjengelig egentlig.

    Det gjør de. Men ikke nødvendigvis når du selv ønsker det. De finner nye ruter når de selv detekterer at det finnes noe bedre eller at den gamle ikke er god nok. Som oftest er de gamle rutene gode nok. I tillegg bruker de tid på det. Noen enheter bruker timer, andre enheter opp til en uke som feks enkelte Aqara sensorer.

  8. Garasjeport er populært å automatisere. Her er min løsning og kanskje kan noen bruke det videre.

    Min åpner er av den enkle typen. Den har to innganger, en for nødstopp og en for å veksle opp eller ned. 

    Til denne har jeg koblet til et esp32 kort som jeg kjører esphome på.

    IMG_20240203_101850076b.jpg.dfa49dde7d9c6b488c4e51b93321cb43.jpg

     

    I esphome har jeg definert en "cover" som er tidsbasert og med endebrytere.

     

    cover:
      - platform: feedback
        name: "${devicename}"
        id: garasjeport
        has_built_in_endstop: true
        assumed_state: false
        direction_change_wait_time: 5s
        close_endstop: status_lukket
        open_endstop: status_aapen
        open_duration: 15s
        close_duration: 18s



    Endebrytere trenger en strengt tatt ikke, men uten de så er det vanskelig for Home Assistant å vite om port er åpen eller lukket. Jeg hadde i land tid en zigbee dørsensor som viste om port var lukket og status på den ble sendt til esp32 slik at jeg kunne sette status på "cover" at porten var igjen. Etterhvert har jeg byttet ut zigbee sensor med brytere koblet til esp32 direkte. Ikke fordi det virker bedre, men fordi jeg hadde lyst.

    IMG_20240203_101940711b.jpg.f7c3734f1347c6026dc7b19cbe73db9d.jpg

     

    I tillegg har jeg definert noen binære sensorer i esphome som forteller om status på port. Det er lukket, åpen og i bevegelse. I tillegg noen trykknapper for å starte en sekvens og å avbryte denne sekvensen. Til slutt noen innverdier for å sette antall sekunder til port åpnes og lukkes.

    I og med at denne er synlig i Home Assistant som en "cover", har jeg full kontroll på port. Jeg kan dra i en skyvekontroll og settte porten til en vilkårlig posisjon. Ikke så mye brukt til annet enn å sette i luftestilling eller åpne en halvmeter for å ta i mot en pakkelevering når jeg selv er på jobb. Jeg har et kamera inne i garasjen så jeg kan følge med på at pakken er kommet innenfor.
    image.png.cec52f0d30b4f34cb7065177a6d2486b.png

    Til porten fulgte det med to fjernkontroller og disse var årsaken til at jeg lagde min egen styring. Fjernkontrollene har tydeligvis dagshumør og noen dager må en helt inntil garasjeportåpnerens antenne før de reagerer. Det var veldig frustrerende. 
    Det første jeg lagde, var en NFC brikke på en lur og usynlig plass i bilen. Når jeg holder telefon over denne, så åpnes port.
    Etterhvert er det kommet zigbee-brytere inne i hus ved utgangsdør og inne i garasje ved port. Med disse kan jeg åpne og lukke, samt slå på nødstopp. Jeg har også lagd det slik at hvis bakluke på bil er åpen så slås nødstopp på. Da kan ikke port betjenes fra annet enn innside av garasje ved å slå av nødstopp først.
    Og så har jeg en trykknapp i garasje som setter i gang en sekvens med å vente-åpne-vente-lukke. Da får en tid til å sette seg inn i bil og port går ned automatisk etter å ha kjørt ut. Sekvensen avbrytes hvis en trykker på knapp en gang til eller åpner garasjedør. Kona har en egen evne til å finne ut at hun ikke har bilnøkkel med seg og da må hun inn igjen i huset. Da er det dumt at port går opp og ned i mellomtiden.

    Sensorer som esphome sender til Home Assistant, brukes til alarm og å trigge lys i garasje. Jeg setter også farge på en lyslist over port som viser om den er i bevegelse eller helt oppe.

    • Like 3
  9. Einar skrev (1 time siden):

    Jeg har bestilt en Sonoff Zigbee dongle for å se om det er deCONZ

    Jeg byttet ut deconz og conbee ii med sonoff zbdongle-p og zigbee2mqtt. Det hele har gått fra smått irriterende til dønn stabilt. Ingenting har falt ut. Zigbee2mqtt har hatt en krasj på 1 år. Jeg har laget en automasjon som fanger opp dette og starter den på nytt hvis det skulle skje flere ganger.

  10. Februar utgaven av Home Assistant får støtte for å lese inn forbruksdata fra Elvia.

    https://rc.home-assistant.io/integrations/elvia


    Edit: Tenk hvis vi kunne fått en universell løsning for å lese data fra elhub, men neida. Elhub har selvfølgelig ikke noe api for slikt. Hvorfor skulle et offentlig eid selskap som har som oppgave å lagre og distribuere målepunktdata, ha et api som privatpersoner kan bruke?

  11. Jeg er, som sikkert flere andre, avhengig av en daglig dose medisiner. Sånn er det når en er arvelig belastet med høyt blodtrykk. For å huske å ta medisin og for å ha kontroll på beholdning, har jeg brukt en app. Men har egentlig alltid tenkt at de som lager denne app'en får mye informasjon om meg. Så for et par dager siden fant jeg ut at jeg ville la Home Assistant styre dette.

    Så det jeg har nå er en side i HA som viser min tablettbruk. I HA kan en sette visning og tilgang til sider ut i fra innlogget bruker så når kona tar dette fram på hennes mobil så ser hun sitt og ikke mitt. HA holder kontroll på beholdning og skifter farge på ikon når det nærmer seg tur til apotek. Har jeg ikke trykket på "Medisin tatt" knappen, får jeg et varsel på tlf som jeg svarer ja eller nei på (actionable notification som HA appen har). Her kan jeg sette "kanal" slik at jeg kan bruke egen varsellyd. Etter en time med litt fikling har jeg noe som fungerer bedre enn medisin-appen. Og herfra er det mange muligheter. Jeg kan feks varsle med et lys hjemme. Jeg kan la være å varsle på tlf hvis jeg ikke er hjemme. Det er jo ingen vits i det når tablettene ligger hjemme. Og jeg kan ha en trykknapp i skuffen på badet som teller ned beholdning.

    PS. Jeg tar noen tabletter om morgen og noen om kveld. Selvsagt måtte jeg da lage det slik at det telles ned på de tablettene som gjelder for aktuelt tidsrom. Og det vises når de ble sist tatt.

    image.png.f27b1e210faf0e18f01ed89ffbe168da.png

    • Like 4
  12. MrE skrev (28 minutter siden):

    Hvilken SSR benytter du? Nysgjerrig på hardwaren og hvordan dette er koblet sammen. 🙂

    https://www.elfadistrelec.no/no/elektriske-releer-rm48-1no-50a-530v-skrueklemme-carlo-gavazzi-rm1a48d50/p/13745035?queryFromSuggest=true&itemList=suggested_search

    Ser denne har økt voldsomt i pris, men det var denne jeg kjøpte. Esp8266 er på en Sonoff sak som hadde et lite 10A rele. Jeg loddet av releet og førte to ledninger fra der releets spole var koblet til, til optokobler på SSR. Og så satte jeg en inn en motstand i parallell slik at motstand totalt ble den samme som motstanden i releets spole.

    Egenskap ved SSR som var viktig for meg var innkobling og utkobling ved nullgjennomgang av spenning og at den hadde riktig spenningsnivå på optokobler. Den er litt overdimensjonert på strøm, men greit nok. Kjøleplaten er stor nok til at den holder seg under 50 grader på full belastning.


    image.thumb.png.2b48bc2501d8aff5d5b2199f1a7b01a5.png

     

    IMG_20240130_212101385b.jpg

    • Like 1
  13. Min VVB er styrt av en esp8266 og den får stadig ny funksjonalitet. I sommer byttet jeg ut to DS18B20 sensorer med Oso sin sensorstav med 3 temperaturfølere.
    De 3 sensorene bruker jeg til å prioritere oppvarming av vannet. Hvis bunntemperatur kommer under ønsket temperatur, så varmes vannet med lav effekt og typisk rundt om 100W. Kommer sentertemp. under ønsket temperatur, så økes effekten "passelig" og hvis topptemperatur er under ønsket temp. så er det 100% effekt og 2kW. På den måten klarer jeg å stoppe at temperatur synker enda lavere uten å utfordre nettleie og å bruke minst mulig strøm når pris ikke er optimal.
    Temperatur settes til middels en gang i døgnet og på billigste timer. Til høy hver 11. dag på billigste timer.
    I det siste har jeg lagt inn nøyaktig beregning av oppvarmingstid slik at jeg treffer bedre på den billigste timen istedenfor å utnytte nest-billigste og 1/3 av den billigste. Effekten på varmeelementet er via en SSR så jeg kan styre effekt trinnløst vha puls-bredde modulering og dette er effektivt for å holde seg under effekttrinn på nettleie.
    Psnitt/Pmaks er snitt effekt på siste oppvarming delt på 2000W. Da får jeg et forholdstall som jeg bruker til å beregne oppvarmingstid på neste døgns syklus. Det gir ikke nøyaktig tid, men det er en god indikasjon når VVB blir nedprioritert i forhold til lading av biler.

    Esp8266 er selvsagt programmert ved hjelp av Esphome. Kodefilen er ikke mer enn 360 linjer.

    image.thumb.png.9161a3d176d54c0bdc90af54862a3fee.png

    image.png.01056683052f10329e79d7bf05d786eb.png

    • Like 4
  14. christbj skrev (37 minutter siden):

    Det blir for enkelt, da kan han like godt kjøpe den ferdige lykten jeg lenket til. 😄

    Sant nok, dumme meg. Jeg tenkte på IKEA sine skaplys, men det er jo også for enkelt. Jeg har noen IKEA garderobelys med detektor for skapdør. De virker helt fint, men jeg burde allikevel bytte de ut....... 🤪

    • Haha 2
  15. christbj skrev (3 minutter siden):

    Da er det bedre med en reed-switch (magnetkontakt som lukker kretsen ved kontakt) som kan vekke ESP32 brikken fra dvale og så kan den igjen lukke et rele som tenner et lys.

    Hehe.

    Hva med å bruke et reed rele eller en annen magnetkontakt som tåler nok strøm til å drive lyset?

  16. Håvardgj skrev (11 timer siden):

    Fikk endelig renovasjonen inn i Home Assistant til å se ut slik jeg ville:

    image.png.a41542f33787f0bc724d2d3d1d624c7b.png

     

    reinstallerte "minrenovasjon" (https://github.com/eyesoft/home_assistant_min_renovasjon) etter at den sluttet å fungere etter en oppdatering.  Satte opp template for å få endret fra å vise dato, til å vise gjenværende dager.

     

    så nå blir det enklere å se når søppeldunken må trilles ned til veien

     

    kode:

      Skjul innhold

    Jeg er ikke veldig flink med template-funksjonen, så det er ikke sikkert dette er den mest optimale løsningen, men det ser ut til å fungere

     

    type: vertical-stack
    cards:
      - type: custom:mushroom-title-card
        title: Renovasjon
        alignment: center
      - type: horizontal-stack
        cards:
          - type: custom:mushroom-template-card
            primary: Restavfall
            secondary: >-
              {% set days_left = (strptime(states('sensor.restavfall'), '%d/%m/%Y',
              today_at()) | as_local - today_at()).days %}
    
              {% if days_left >= 2 -%}
    
              Om {{ days_left }} dager
    
              {% elif days_left == 1 %}
    
              I morgen
    
              {% elif days_left == 0 %}
    
              I dag!
    
              {% else %}
    
              Ukjent
    
              {%- endif %}
            icon: mdi:trash-can-outline
            multiline_secondary: true
            icon_color: grey
            fill_container: true
            entity: sensor.restavfall
            badge_icon: >-
              {% set days_left = (strptime(states('sensor.plast'), '%d/%m/%Y',
              today_at()) | as_local - today_at()).days %}
    
              {% if days_left == 1 %} 
    
              mdi:exclamation
    
              {%- endif %}
            badge_color: red
          - type: custom:mushroom-template-card
            primary: Plastavfall
            secondary: >-
              {% set days_left = (strptime(states('sensor.plast'), '%d/%m/%Y',
              today_at()) | as_local - today_at()).days %}
    
              {% if days_left >= 2 -%}
    
              Om {{ days_left }} dager
    
              {% elif days_left == 1 %}
    
              I morgen
    
              {% elif days_left == 0 %}
    
              I dag!
    
              {% else %}
    
              Ukjent
    
              {%- endif %}
            icon: mdi:spray-bottle
            multiline_secondary: true
            icon_color: purple
            fill_container: true
            entity: sensor.plast
            badge_icon: >-
              {% set days_left = (strptime(states('sensor.plast'), '%d/%m/%Y',
              today_at()) | as_local - today_at()).days %}
    
              {% if days_left == 1 %} 
    
              mdi:exclamation
    
              {%- endif %}
            badge_color: red
      - type: horizontal-stack
        cards:
          - type: custom:mushroom-template-card
            primary: Glass/Metall
            secondary: >-
              {% set days_left = (strptime(states('sensor.glass_metallemballasje'),
              '%d/%m/%Y', today_at()) | as_local - today_at()).days %}
    
              {% if days_left >= 2 -%}
    
              Om {{ days_left }} dager
    
              {% elif days_left == 1 %}
    
              I morgen
    
              {% elif days_left == 0 %}
    
              I dag!
    
              {% else %}
    
              Ukjent
    
              {%- endif %}
            icon: mdi:bottle-wine
            multiline_secondary: true
            icon_color: orange
            fill_container: true
            entity: sensor.glass_metallemballasje
            picture: ''
            badge_icon: >-
              {% set days_left = (strptime(states('sensor.plast'), '%d/%m/%Y',
              today_at()) | as_local - today_at()).days %}
    
              {% if days_left == 1 %} 
    
              mdi:exclamation
    
              {%- endif %}
            badge_color: red
          - type: custom:mushroom-template-card
            primary: Bioavfall
            secondary: >-
              {% set days_left = (strptime(states('sensor.matavfall'), '%d/%m/%Y',
              today_at()) | as_local - today_at()).days %}
    
              {% if days_left >= 2 -%}
    
              Om {{ days_left }} dager
    
              {% elif days_left == 1 %}
    
              I morgen
    
              {% elif days_left == 0 %}
    
              I dag!
    
              {% else %}
    
              Ukjent
    
              {%- endif %}
            icon: mdi:food-apple-outline
            multiline_secondary: true
            icon_color: green
            fill_container: true
            entity: sensor.matavfall
            badge_icon: >-
              {% set days_left = (strptime(states('sensor.plast'), '%d/%m/%Y',
              today_at()) | as_local - today_at()).days %}
    
              {% if days_left == 1 %} 
    
              mdi:exclamation
    
              {%- endif %}
            badge_color: red
      - type: horizontal-stack
        cards:
          - type: custom:mushroom-template-card
            primary: Papir
            secondary: >-
              {% set days_left = (strptime(states('sensor.papir'), '%d/%m/%Y',
              today_at()) | as_local - today_at()).days %}
    
              {% if days_left >= 2 -%}
    
              Om {{ days_left }} dager
    
              {% elif days_left == 1 %}
    
              I morgen
    
              {% elif days_left == 0 %}
    
              I dag!
    
              {% else %}
    
              Ukjent
    
              {%- endif %}
            icon: mdi:book-open-blank-variant
            multiline_secondary: true
            icon_color: blue
            fill_container: true
            entity: sensor.papir
            badge_icon: >-
              {% set days_left = (strptime(states('sensor.plast'), '%d/%m/%Y',
              today_at()) | as_local - today_at()).days %}
    
              {% if days_left == 1 %} 
    
              mdi:exclamation
    
              {%- endif %}
            badge_color: red

     



    Dette du har gjort her med maler skal i teorien og i praksis ikke være nødvendig. Home Assistant skal vise noe tilsvarende helt på egenhånd.

    Her har jeg satt en sensor til 

    image.png.65242cf690e919f31490d83610b503b6.png

     

    .. og HA viser "Neste uke" i kortet.
    image.png.4086f4eee97b2e2ae1131aeac97f5af0.png

    Settes dato til sensoren til 20. januar, viser kortet dette:
    image.png.bd0de13bed6c76c80c380282db689e3b.png

    For at dette skal virke, må sensor ha device_class satt til timestamp og sensor må ha en tilstand som tolkes som en dato og tid med tidssone, altså at den faktisk er en timestamp.

    Og i samme åndedrag - hvis en sensor har device_class satt til duration så vil et flyttall vises som timer, minutter og sekunder.
    Her er en sensor brukt som har verdien 1,2 og dette vises som 1:12:00
    image.png.08b80d44530352ba945de9111014cbd8.png


    Men du har fått det til å virke slik du vil ha det og det er det viktigste. Min kommentar er bare til info om at det skal være mulig å gjøre dette på en lett måte.

    • Like 2
  17. minim skrev (13 minutter siden):

    Det høres bra ut. Da skal jeg prøve å legge over til node red i kveld å se hvordan det ser ut. Jeg jobber med bygg automasjon til dagen og eksperimentering med hjemme automasjon er virkelig noe helt annet. Savner Basic ting som å fritt kunne lage seg bilder og ikke bare "kort" samt mye friere funksjons programmering, men det ser ut som at node red har noe mer av dette enn home assistant. Man kan sikkert gjøre det meste i alt dette med åpen kildekode, men terskelen er såpass høy at jeg har ikke orket å bruke tid på å sette meg inn i det enda. 

    Sikkert dumt spørsmål, men har den statisk ip eller kan den ha fått tildelt ny ip ved strømstans?

     

    Om du kjører Wireshark på maskinen modbus tcp kjører fra så har Wireshark ferdig filter for modbus tcp så du kan se om trafikk sendes ut og om det kommer noe svar. 

    Home Assistant har også bilder som en kan legge UI på. Men i utgangspunktet er det "kort" som er den enkle måten å lage det på.
    De fleste tror jeg løser dette 

    Sitat

    mye friere funksjons programmering

    med å installere pyscript modulen. Da kan en lage rutinene i python. https://hacs-pyscript.readthedocs.io/en/stable/overview.html

    Jeg tror nok du går på en liten blemme med å introdusere enda et nytt verktøy i automatiseringen istedenfor å sette seg inn i hvordan modbus konfigureringen virker i HA. Men det er jo bare min mening. Uanz, du får det nok til med node-red også.

    • Thanks 1
  18. Jeg endrer stadig på dette og har tatt med mulighet for å hente strømpris fra Tibber. Skriptet velger selv hvor den skal hente prisen i fra, men hvis dette gjøres feil, kan jeg slå av kildene med brytere i UI.

    image.png.9b19dc45f601ffb96542957d494df40d.png

     

    from datetime import datetime,timedelta
    import holidays
    
    YEAR = datetime.today().year
    NOR_HOLIDAYS = holidays.NO(years=[YEAR, YEAR+1])
    
    state.persist('pyscript.total_pris_for_strom', default_value=0, default_attributes={"unit_of_measurement":"NOK"})
    state.persist('pyscript.snittpris_for_strom', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.spart_paa_strom', default_value=0, default_attributes={"unit_of_measurement":"NOK"})
    state.persist('pyscript.strompris', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.totalstrompris', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.nettleie', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.stromstotte', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.spotpris', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.gjennomsnittlig_strompris', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.peak_strompris', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.offpeak_1_strompris', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.offpeak_2_strompris', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.hoyeste_strompris', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    state.persist('pyscript.laveste_strompris', default_value=0, default_attributes={"unit_of_measurement":"NOK/kWh"})
    
    @time_trigger("cron(59 * * * *)")
    def akkumulere_stromkostnad():
        p = round(float(pyscript.totalstrompris) * float(sensor.estimated_hourly_consumption) + float(pyscript.total_pris_for_strom), 2)
        pyscript.total_pris_for_strom = p
    
        if float(sensor.consumption_thisday) > 0:
            pyscript.snittpris_for_strom = round(float(pyscript.total_pris_for_strom) / float(sensor.consumption_thisday), 4)
        
        pyscript.spart_paa_strom = round(float(sensor.consumption_thisday) * (float(pyscript.gjennomsnittlig_strompris) - float(pyscript.snittpris_for_strom)), 2)
    
    @time_trigger("cron(0 0 * * *)")
    def nullstille_stromkostnad():
        pyscript.total_pris_for_strom = 0
    
    @time_trigger("cron(0 * * * *)")
    @state_trigger("input_button.oppdater_strompris")
    def strompris():
        #state.set("pyscript.strompris", new_attributes={})
        
        grid_night = float(input_number.nettleie_natt) / 100.0
        grid_day = float(input_number.nettleie_dag) / 100.0
        additional_costs = float(input_number.paslag_strom) / 100.0
        
        entso_valid = False
        if sensor.average_electricity_price_today.prices is not None and len(sensor.average_electricity_price_today.prices) >= 48:
            ld = datetime.strptime(sensor.average_electricity_price_today.prices[47]["time"], "%Y-%m-%d %H:%M:%S%z")
            if datetime.now() < ld.replace(tzinfo=None):
                entso_valid = True
        
        if input_boolean.strompriskilde_tibber == 'on' and sensor.energy_price_gabriel_edlands_veg_16.tomorrow_valid == True:
            pyscript.strompris.updatetime = datetime.now().isoformat()
            pyscript.strompris.source = "Tibber"
            l = []
    
            for sourceprice in sensor.energy_price_gabriel_edlands_veg_16.raw_today + sensor.energy_price_gabriel_edlands_veg_16.raw_tomorrow:
                pr = {}
                d = datetime.strptime(sourceprice["time"], "%Y-%m-%dT%H:%M:%S.000%z")
                pr["start"] = d.isoformat()
                pr["end"] = (d + timedelta(hours=1)).isoformat()
                pr["spotprice"] = round(float(sourceprice["total"]) - float(additional_costs), 4)
                pr["gridprice"] = round(grid_day if is_peak(d) else grid_night, 4)
                pr["payback"] = round(payback(float(pr["spotprice"])), 4)
                pr["totalprice"] = round(float(pr["spotprice"]) + float(pr["gridprice"]) + float(additional_costs) - float(pr["payback"]), 4)
                l.append(pr)
    
            pyscript.strompris.prices = l
        elif input_boolean.strompriskilde_nordpool == 'on' and sensor.nordpool.tomorrow_valid == True:
            pyscript.strompris.updatetime = datetime.now().isoformat()
            pyscript.strompris.source = "Nordpool"
            l = []
    
            for sourceprice in sensor.nordpool.raw_today + sensor.nordpool.raw_tomorrow:
                pr = {}
                d = sourceprice["start"]
                pr["start"] = d.isoformat()
                pr["end"] = (d + timedelta(hours=1)).isoformat()
                pr["spotprice"] = round(float(sourceprice["value"]), 4)
                pr["gridprice"] = round(grid_day if is_peak(d) else grid_night, 4)
                pr["payback"] = round(payback(float(pr["spotprice"])), 4)
                pr["totalprice"] = round(float(pr["spotprice"]) + float(pr["gridprice"]) + float(additional_costs) - float(pr["payback"]), 4)
                l.append(pr)
    
            pyscript.strompris.prices = l
        elif input_boolean.strompriskilde_entsoe == 'on' and entso_valid == True:
            pyscript.strompris.updatetime = datetime.now().isoformat()
            pyscript.strompris.source = "Entso-e"
            l = []
            
            for sourceprice in sensor.average_electricity_price_today.prices:
                pr = {}
                d = datetime.strptime(sourceprice["time"], "%Y-%m-%d %H:%M:%S%z")
                pr["start"] = d.isoformat()
                pr["end"] = (d + timedelta(hours=1)).isoformat()
                pr["spotprice"] = round(float(sourceprice["price"]), 4)
                pr["gridprice"] = round(grid_day if is_peak(d) else grid_night, 4)
                pr["payback"] = round(payback(float(pr["spotprice"])), 4)
                pr["totalprice"] = round(float(pr["spotprice"]) + float(pr["gridprice"]) + float(additional_costs) - float(pr["payback"]), 4)
                l.append(pr)
            
            pyscript.strompris.prices = l
        
        price_sum = 0.0
        peak_sum = 0.0
        offpeak1_sum = 0.0
        offpeak2_sum = 0.0
        high = -1000
        low = 1000
    
        for sourceprice in pyscript.strompris.prices:
            if datetime.now() >= datetime.fromisoformat(sourceprice["start"]).replace(tzinfo=None) and datetime.now() < datetime.fromisoformat(sourceprice["end"]).replace(tzinfo=None):
                pyscript.strompris = round(float(sourceprice["totalprice"]), 4)
                pyscript.totalstrompris = round(float(sourceprice["totalprice"]), 4)
                pyscript.nettleie = round(float(sourceprice["gridprice"]), 4)
                pyscript.stromstotte = round(float(sourceprice["payback"]), 4)
                pyscript.spotpris = round(float(sourceprice["spotprice"]), 4)
            
            if datetime.now().day == datetime.fromisoformat(sourceprice["start"]).day:
                price_sum += sourceprice["totalprice"]
    
                if datetime.fromisoformat(sourceprice["start"]).hour < 8:
                    offpeak1_sum += sourceprice["totalprice"]
                elif datetime.fromisoformat(sourceprice["start"]).hour < 20:
                    peak_sum += sourceprice["totalprice"]
                else:
                    offpeak2_sum += sourceprice["totalprice"]
                
                if high < sourceprice["totalprice"]:
                    high = sourceprice["totalprice"]
                
                if low > sourceprice["totalprice"]:
                    low = sourceprice["totalprice"]
        
        pyscript.gjennomsnittlig_strompris = round(float(price_sum) / 24.0, 4)
        pyscript.peak_strompris = round(float(peak_sum) / 12.0, 4)
        pyscript.offpeak_1_strompris = round(float(offpeak1_sum) / 8.0, 4)
        pyscript.offpeak_2_strompris = round(float(offpeak2_sum) / 4.0, 4)
        pyscript.hoyeste_strompris = round(float(high), 4)
        pyscript.laveste_strompris = round(float(low), 4)
    
    def is_peak(t : datetime):
        if t.isoweekday() >= 6 or t.hour <= 5 or t.hour >= 22 or t.date() in NOR_HOLIDAYS:
            return False
        else:
            return True
    
    def payback(spot : float):
        return max((spot - 0.9125) * 0.9, 0.0)

     

    • Like 1
  19. minim skrev (8 timer siden):

     

    Snippet litt fra configen din. da jeg hadde noen spørsmål rundt hvordan du har bygget opp configen. I modbus config dokumentasjonen så viser de et oppsett lignende det jeg har brukt under her. Dette er et Heru S160ec anlegg hvor det meste fungerer, men "climates" ble feil etter at heru ga ut 1.10 firmware som endrer skalering på temperatur innganger (input registers), men ikke utganger (holding reister). Det er et sidespor til spørsmålet, men for å løse dette problemet tenkte jeg å sette opp et enkelt setpunkt som du har gjort med "number", men da ser jeg at du har bygget det opp veldig ulikt min config med "modbus_controller"/platform. Dette med platform og modbus hvor finner jeg dokumentasjon på måten du har løst dette på så jeg får lest litt om dette evnt har du en enkel forklaring på hvordan det henger sammen?

     

    Jeg er rimelig lost i oppsett av home assistant så det er mulig jeg gjør ting helt feil i utgangspunktet her 😛 Configen min er noen år gammel også så mulig noe av det er en utdatert måte å gjøre det på.  

     

    Edit: Da fant jeg ut at det var en egen komponent knyttet til ESPn dere bruker så da får jeg gruble videre på min løsning som bruker modbus tcp direkte 🙂

     

    https://esphome.io/components/modbus

     

    modbus:
      - name: hub1
        type: tcp
        host: 10.0.0.11
        port: 502
        sensors:
          - name: Utetemperatur
            unit_of_measurement: °C
            slave: 1
            address: 1
            input_type: input
            unique_id: 400
            scale: 0.1 
            precision: 1
          - name: Tilluftstemperatur
            unit_of_measurement: °C
            slave: 1
            address: 2
            input_type: input 
            unique_id: 401
            scale: 0.1
            precision: 1
          - name: Fraluftstemperatur
            unit_of_measurement: °C
            slave: 1
            address: 3
            input_type: input
            unique_id: 402
            scale: 0.1
            precision: 1 
          - name: Avkasttemperatur 
            unit_of_measurement: °C
            slave: 1
            address: 4
            input_type: input
            unique_id: 403
            scale: 0.1
            precision: 1
          - name: Etter varmegjenvinner
            unit_of_measurement: °C
            slave: 1
            address: 6
            input_type: input
            unique_id: 404
            scale: 0.1
            precision: 1
          - name: Filter tid til skifte
            unit_of_measurement: dager
            slave: 1
            address: 19
            input_type: input
            unique_id: 405
          - name: Tilluftsvifte
            unit_of_measurement: '%'
            slave: 1
            address: 24
            input_type: input
            unique_id: 406 
          - name: Fraluftsvifte
            unit_of_measurement: '%'
            slave: 1
            address: 25
            input_type: input
            unique_id: 407 
          - name: Varmebatteri 
            unit_of_measurement: '%'
            slave: 1
            address: 28
            scale: 0.3921568
            input_type: input
            unique_id: 500        
          - name: Gjenvinner
            unit_of_measurement: '%'
            scale: 0.392156
            slave: 1
            address: 29
            input_type: input
            unique_id: 408
          - name: Setpunkt økonomi
            unit_of_measurement: °C
            slave: 1
            address: 0
            input_type: holding
            unique_id: 409
          - name: Setpunkt comfort
            unit_of_measurement: °C
            slave: 1
            address: 1
            input_type: holding
            unique_id: 410
          - name: heater type
            slave: 1
            address: 65
            input_type: holding
            unique_id: 417
          - name: heater enabled
            slave: 1
            address: 66
            input_type: holding
            unique_id: 418
        switches:
          - name: "Heater"
            slave: 1
            address: 66
            command_on: 1
            command_off: 0
            write_type: holding
            scan_interval: 6
            verify:
                input_type: holding
                address: 66
                state_on: 1
                state_off: 0
          - name: "Boost"
            slave: 1
            address: 2
            command_on: 1
            command_off: 0
            write_type: coil
            scan_interval: 6
            verify:
                input_type: coil
                address: 2
                state_on: 1
                state_off: 0
    
        climates:
          - name: "Setcomfort"
            address: 2
            input_type: input
            max_temp: 35
            min_temp: 15
            offset: 0
            precision: 1
            scale: 1
            target_temp_register: 1
            temp_step: 1
            temperature_unit: °C
            unique_id: 419
    
    template:
      - sensor:
          - name: "varmebatteri_effekt"
            unit_of_measurement: W
            state: "{{ states('sensor.varmebatteri') | int * 12 }}"
          - name: "virkningsgradtil"
            unit_of_measurement: '%'
            state: "{{ (((states('sensor.etter_varmegjenvinner') | int - states('sensor.utetemperatur') | int ) / (states('sensor.fraluftstemperatur') | int -  states('sensor.utetemperatur') | int )) * 100)|round(1) }}"
          - name: "virkningsgradfra"
            unit_of_measurement: '%'
            state: "{{ (((states('sensor.fraluftstemperatur') | int - states('sensor.avkasttemperatur') | int ) / (states('sensor.fraluftstemperatur') | int -  states('sensor.utetemperatur') | int )) * 100)|round(1) }}"
    

     



    Ja, som du så er min yaml for esp noden.

×
×
  • 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.