Inmiddels ook de socket opgehangen met een microschakelaar erin die ook aan een single switch hangt.
Op deze manier kan ik weten of de kabel in de auto zit of niet.
Als we namelijk de paal in zijn geheel schakelen ben ik ook de connectie met de auto kwijt. Om niet de paal onnodig te schakelen (bijvoorbeeld als er flink overschot is en de auto nog onder zijn vereiste % zit) wilde ik dat alleen doen als de auto er ook nog aan hangt.

Afbeeldingslocatie: https://tweakers.net/i/U5lTlrQj_ai-G4l4OJooomqrtRY=/x800/filters:strip_icc():strip_exif()/f/image/yW0vwMn0aeHXjvZJXRjEb2hp.jpg?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/E9eloQlHBdqfoozDZ3aXnLT-WRs=/x800/filters:strip_icc():strip_exif()/f/image/Q0YMFzqOvxHCELB9mqXQiSu1.jpg?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/aICLC5ZONqTe0JTBkQ3V3M4i22A=/800x/filters:strip_exif()/f/image/WHXfFmzDAZDW8S3jaLYpf6Zi.png?f=fotoalbum_large

Alle scénes die met slim laden te maken hebben kijken nu ook naar de status van de stekker en niet persé of ik wel of niet thuis ben. Het komt natuurlijk weleens voor dat ik er niet ben maar weg ben zonder de auto die dan nog aan de stekker hangt bijvoorbeeld. In de vorige situatie ging hij dan dus niet "slim" laden. Nu wel.
Inmiddels draait dit nu een kleine 3,5 week zonder problemen. Gisteren is er 2 keer geschakeld en heb ik van de 42kWh opgewekte er 36.3 naar de auto gekregen :) .

inmiddels ook een aardig avontuur achter de rug met een rs485 - eth adapter om mijn zwembad warmtepomp te kunnen uit lezen en besturen.
Ik ga de vertaal slag nog doen om vanuit fibaro direct modbus te praten maar het zit wederom helaas voor nu even in HA. Die doet qua aansturing en dergelijk natuurlijk niets behalve fungeren als gateway. Binnen HA kan je gewoon met decimalen en register benamingen je modbus aanroepen maar binnen Fibaro verwacht hij de volle hex strings en zit je ook met timing, de seriële bus is beperkt en moet sequentieel afgevuurd worden, iets wat HA by default doet als je het onder dezelfde "entiteit" plaatst.

Afbeeldingslocatie: https://tweakers.net/i/_XWbCva1VOBSgC4nTNaF5GyRdZk=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/9SmyI9yL9FnumLaZWI7FiO7Y.png?f=user_large

Afbeeldingslocatie: https://tweakers.net/i/GilcS4y2upZlo-GpTnj8pn3cXHE=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/cS17QoDMKAal7lsP0ZTepSoe.png?f=user_large

[ Voor 55% gewijzigd door GeeMoney op 08-05-2024 21:05 ]


  • Soesje
  • Registratie: Mei 2002
  • Laatst online: 05-08-2025

Soesje

is ook zo

Beetje zonde om een eigen draadje te maken als deze er al is!

Op mijn HCL3 werken scenes super traag. Meestal 1-3 minuten en sommige devices worden soms overgeslagen. Het lijkt alsof hij even blijft hangen. Heb de HCL3 net, op mijn 8 jaar oude HCL1 had ik dit niet.

Ik heb 8 Fibaro Dimmer2 en 2 plugs, en alles bevindt zich op een kleine afstand van elkaar.

Details:
  • Alle apparaten hebben de standaardconfiguratie (geen parameters gewijzigd na fabrieksreset).
  • Alle apparaten draaien op de nieuwste firmware.
  • Bij het uitvoeren van scènes (aan, uit of dimmen op x%) duurt het soms 1-3 minuten voordat ze deze afgerond is. Soms voeren 1 of 2 devices helemaal geen actie uit.
  • Ik heb de logs hieronder/als bijlage toegevoegd als voorbeeld. Dit probleem doet zich voor bij alle scènes, of ze nu zijn geconfigureerd via HCL3 in LUA of via de Yubi-app. Er is geen verschil.
Heeft iemand vergelijkbare ervaringen of suggesties om dit probleem op te lossen?

Alvast bedankt voor jullie hulp!
Afbeeldingslocatie: https://tweakers.net/i/SLBSCCxatYfOUA_J7Sw0Yf6QpHQ=/800x/filters:strip_exif()/f/image/uC2tamgvEZNnqoLZwJRLCSuO.png?f=fotoalbum_large
@Soesje heb je toevallig gekozen voor de nieuwe z-wave Engine 3.0 bij het koppelen op je HC3L ?

  • Soesje
  • Registratie: Mei 2002
  • Laatst online: 05-08-2025

Soesje

is ook zo

GeeMoney schreef op zondag 10 november 2024 @ 21:20:
@Soesje heb je toevallig gekozen voor de nieuwe z-wave Engine 3.0 bij het koppelen op je HC3L ?
Dit is misschien wel de gouden tip. Zover ik kan terugvinden zie je niet wat je hebt gekozen in de huidige instellingen. Dus ik ga opnieuw installeren.

  • Jfwiet
  • Registratie: Juni 2002
  • Laatst online: 20-09 12:14
Als je een nieuw Z-Wave apparaat probeert in te leren heb je een knop geavanceerd onderaan. Als je in het volgende scherm kan kiezen voor S2 security is het Z-Wave engine 3.0. Als je alleen kan kiezen tussen S0 en S1 dan zit je op Z-Wave engine 2.0.

  • Soesje
  • Registratie: Mei 2002
  • Laatst online: 05-08-2025

Soesje

is ook zo

@GeeMoney je bent een held, de HCL3 had bijna vliegles gekregen vanaf de bovenste verdieping :)

Op z-wave engine 2.0 draait alles als een zonnetje.

@Jfwiet goede tip. Je kan het ook zien bij z-wave in het configuratiescherm, 3.0 heeft meerdere tabbladen. 2.0 heeft een enkel tabblad en de optie met "polling time interval" welke bij 3.0 weer ontbreekt.

[ Voor 40% gewijzigd door Soesje op 11-11-2024 20:48 ]

Voor diegene die een Unifi Protect hebben draaien en middels Webhooks een fibaro scene of device willen triggeren. Dat kan !
https moet ik nog even naar kijken maar plain http werkt in ieder geval:Afbeeldingslocatie: https://tweakers.net/i/_mOSmccS7IxKkjViQpFIJR1CjYk=/800x/filters:strip_exif()/f/image/JlKr5sOQrocKt3r5iFF7S7aA.png?f=fotoalbum_large

Je dient je userid:password even te encoden naar Base64 en dat achter de Basic te laatsen in Header 2.
Encoden kan hier:
https://www.base64encode.org

Bovenste veld bijvoorbeeld fibaro:password123 intypen en druk op ENCODE.
Nu ik een Unifi G4 deurbel heb met bijbehorende PoE Chime merkte ik op dat deze een stuk zachter is dan de vorige Doorbird Chime. Nu kan ik hem theoretisch overal plaatsen middels PoE maar hij hing juist in de gang zodat ik hem boven ook zou horen.
Omdat ik ook Sonos speakers en integratie heb draaien in Fibaro bedacht ik mij dat het toch mogelijk moet zijn om een Chime op de Sonos af te spelen als er op de bel gedrukt wordt.
En natuurlijk blijkt dat mogelijk :)
Een beetje in Beta is de integratie voor de G4 deurbel nog maar de knop kan als sesnor opgevoerd worden en werkt.

G4 Integratie is hier te downloaden:
https://forum.fibaro.com/...-beta-v01/#comment-244871
(Je edit de QA na importeren en vervangt de gegevens voor je eigen gegevens, vaak een UDM of UCG device, niet het IP van de camera opvoeren)

Vervolgens krijg je er 2 devices bij waarvan dus 1 een sensor is voor de Deurbel "ring" knop en de ander een Motion sensor.

Voor Sonos gebruik ik de Sonos Zone Controller:
https://marketplace.fibaro.com/items/sonos-zone-controller
Zorg ervoor dat je een (kort) mp3 bestand hebt die in je Music Library binnen Sonos bereikbaar is. Ik heb mijn hele muziek library ook in Sonos staan dus simpelweg de Chime.mp3 opgevoerd die ik wilde laten hore (6 seconden file)

Daarna kan je een LUA scene maken (geavanceerdere functies voor de Sonos zijn alleen aan te spreken middels LUA en niet via device settings in block scénes.

Conditions/triggers gedeeld:
Lua:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
  conditions = { {
      isTrigger = false,
      operator = "==",
      property = "AUTOMATION",
      type = "global-variable",
      value = "TRUE"
    }, {
      id = 932,
      isTrigger = true,
      operator = "==",
      property = "value",
      type = "device",
      value = true
    } },
  operator = "all"
}


Actions:
Lua:
1
hub.call(228, "playFile", "<ip-adres-music-library>/media/Music/Chime.mp3", true, 40)


Ik controleer of mijn variabele AUTOMATION == TRUE is en fals trigger gebruik ik het QA ID van de Deurbel en als die "true" wordt is dat de trigger om vervolgens de actie uit te voeren.
228 is mijn QA ID van mijn Sonos device. Vervolgens de locatie van de Chime.mp3, true betekend dat we eerst een snapshot maken van waar de Sonos mee bezig was, dan voeren we de afspeel actie uit op volume 40 en vervolgens resumed de Sonos weer met waar hij daarvoor mee bezig was eventueel.
Dus stel dat je je Sonos Playbar aanspreekt maar dat er ook TV gekeken wordt op volume 20. Dan mute hij dus de tv, speelt het geluid af op 40 en resumed weer de TV op 20.

  • Soesje
  • Registratie: Mei 2002
  • Laatst online: 05-08-2025

Soesje

is ook zo

Na 1 van de updates vorig jaar is de widget Yubii scenes bij mij weggevallen in iOS. Is er een manier om deze aan de praat te krijgen? Ik krijg soms wel een Siri suggestie voor een shortcut, maar in “shortcuts” staat Yubii ook niet. Werkt dit bij iemand?

Apple / iOS
Widgets enabled in de app (ook al uit- en aangezet)
Soesje schreef op zondag 9 februari 2025 @ 09:57:
Na 1 van de updates vorig jaar is de widget Yubii scenes bij mij weggevallen in iOS. Is er een manier om deze aan de praat te krijgen? Ik krijg soms wel een Siri suggestie voor een shortcut, maar in “shortcuts” staat Yubii ook niet. Werkt dit bij iemand?

Apple / iOS
Widgets enabled in de app (ook al uit- en aangezet)
Helaas, ze werken aan app updates “zo zeggen ze” .
Maar het komt door de update van iOS naar 18. Traditionele widgets werken daar niet meer en ze moeten de apps dus updaten maar dat laat erg op zich wachten. Hier is dat ook momenteel het grootste irritatiepunt. Ik gebruikte ze alleen maar eigenlijk.

  • Soesje
  • Registratie: Mei 2002
  • Laatst online: 05-08-2025

Soesje

is ook zo

GeeMoney schreef op zondag 9 februari 2025 @ 10:20:
[...]


Helaas, ze werken aan app updates “zo zeggen ze” .
Maar het komt door de update van iOS naar 18. Traditionele widgets werken daar niet meer en ze moeten de apps dus updaten maar dat laat erg op zich wachten. Hier is dat ook momenteel het grootste irritatiepunt. Ik gebruikte ze alleen maar eigenlijk.
Ja same. Maar Siri vraagt soms wel of ik een scene wil uitvoeren, die werkt dan ook. Alleen de app komt niet voor in shortcuts. Hoopte dat er een alternatief was op de widgets. Thx!

  • DutchKel
  • Registratie: Mei 2002
  • Laatst online: 07:07
Ik heb sinds kort (ongeveer 2 weken) dat de Philips hue bridge niet meer verbonden is met de Fibaro Home Center 3. Als ik hem opnieuw probeer te verbinden dan lukt dat niet.

To be able to use Hue, new user needs to be registered. To do so, you need to press button on the bridge and than within 30s press "Create user" button below.

Dus eerst op de hue bridge grote knop drukken en erna op create user. De hue bridge heeft een vast ip adres die volgens de app nog steeds klopt.

Het resultaat is: Current State:
Connection timeout error.

Zijn er meer die dit probleem hebben of een oplossing hiervoor hebben? Ik gebruik de Walli Controllers om de Philips Hue lampen aan te zetten dus de koppeling is voor mij wel redelijk belangrijk.

Don't drive faster than your guardian angel can fly.


  • Jfwiet
  • Registratie: Juni 2002
  • Laatst online: 20-09 12:14
Welke QA gebruik je om te koppelen? Heb zelf die van Petrk een tijd gebruikt. In die QA kon je de verbinding herstarten.

Maar als het totaal niet meer functioneert dan is het helaas wel wat werk, maar verwijderen en opnieuw instellen...

  • DutchKel
  • Registratie: Mei 2002
  • Laatst online: 07:07
Jfwiet schreef op donderdag 13 maart 2025 @ 11:17:
Welke QA gebruik je om te koppelen? Heb zelf die van Petrk een tijd gebruikt. In die QA kon je de verbinding herstarten.

Maar als het totaal niet meer functioneert dan is het helaas wel wat werk, maar verwijderen en opnieuw instellen...
Ik heb geen idee welke QA het precies is. Ik voeg hem toe via Voeg apparaat toe en dan kies ik Ander Apparaat

Afbeeldingslocatie: https://tweakers.net/i/N0Sw53NSlRLuaPGUGPnbc4OQ0AQ=/800x/filters:strip_exif()/f/image/lbnhEbeb4MsKhsXYVsZwGov0.png?f=fotoalbum_large

Don't drive faster than your guardian angel can fly.


  • Jfwiet
  • Registratie: Juni 2002
  • Laatst online: 20-09 12:14
Ja dat is de integratie/Quick App van FIBARO zelf.

https://forum.fibaro.com/...ll-in-one/#comment-216725

Dat is de QA die ik gebruikt heb, zit ook meer functionaliteit in.

Dit is ook een hele populaire: https://forum.fibaro.com/files/file/396-childrenofhue/

  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
Na een hele lange stilte qua niewe devices, komt aeotec met de siren 7.
Komen er verder nog nieuwe devices uit van diverse fabrikanten of blijft het hierbij?
akatar schreef op dinsdag 5 augustus 2025 @ 20:26:
Na een hele lange stilte qua niewe devices, komt aeotec met de siren 7.
Komen er verder nog nieuwe devices uit van diverse fabrikanten of blijft het hierbij?
Fibaro is inmiddels “Nice” . En die heeft onder andere nieuwe intercom/camera’s gelanceerd maar volgens mij zijn dat onder water stiekem rebranded ander spul.
Ze zijn verder druk bezig de apps en software te vernieuwen qua look & feel en ivm de overgang naar Nice heb ik het idee dan nieuwe devices te ontwikkelen. Wat er is op Z-Wave gebied althans werkt al wel verrassend goed en is energie zuinig.

Wat volgens mij echt beter moet is zorgen dat ze goede developers binnen halen en dat ook de QuickApp’s beter en meer van de grond komen voor bijvoorbeeld native integraties met grote spelers. Denk aan slimme laadpalen, auto apps, warmtepompen etc.

Dat is nu toch vaak geknutsel of met externe “proxies” als Home Assistant ernaast omdat het native niet kan maar op HomeAssistant wel een batterij developers is die die code maken/onderhouden. Al gaat dat ook vaak gepaard met breaking changes maar goed. De mogelijkheid is er in ieder geval.

Ik mis mijn Audi integratie in Fibaro en doe dat dus nu via Home Assistant net als modbus naar mijn Fairland warmtepomp.

  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
GeeMoney schreef op dinsdag 5 augustus 2025 @ 20:33:
[...]


Fibaro is inmiddels “Nice” . En die heeft onder andere nieuwe intercom/camera’s gelanceerd maar volgens mij zijn dat onder water stiekem rebranded ander spul.
Ze zijn verder druk bezig de apps en software te vernieuwen qua look & feel en ivm de overgang naar Nice heb ik het idee dan nieuwe devices te ontwikkelen. Wat er is op Z-Wave gebied althans werkt al wel verrassend goed en is energie zuinig.

Wat volgens mij echt beter moet is zorgen dat ze goede developers binnen halen en dat ook de QuickApp’s beter en meer van de grond komen voor bijvoorbeeld native integraties met grote spelers. Denk aan slimme laadpalen, auto apps, warmtepompen etc.

Dat is nu toch vaak geknutsel of met externe “proxies” als Home Assistant ernaast omdat het native niet kan maar op HomeAssistant wel een batterij developers is die die code maken/onderhouden. Al gaat dat ook vaak gepaard met breaking changes maar goed. De mogelijkheid is er in ieder geval.

Ik mis mijn Audi integratie in Fibaro en doe dat dus nu via Home Assistant net als modbus naar mijn Fairland warmtepomp.
Klopt, die brengen dezelfde devices uit onder de naam nice, alleen iets nieuws zie ik nog niet komen.
De qa (plugins) blijven een beetje in de hobbyhoek, hoe goed de plugins ook zijn, het is (voor zover ik weet) niet mogelijk om de gebruiker een paar vragen te stellen om de qa in te stellen qua settings.

  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
er is toch een modbus integratie?
akatar schreef op dinsdag 5 augustus 2025 @ 20:41:
er is toch een modbus integratie?
Modbus RTU over TCP zijn een paar QA's van die 7 tientjes per stuk kosten van een Poolse vent ofzo maar niet lijken te doen wat ik zoek.
Ik wil gewoon een device over tcp aan kunnen spreken en registers kunnen uitlezen en wijzigen. Het is mij nog niet gelukt in ieder geval al heb ik er ook niet veel tijd aan besteed nog.

Soms is de developer van de betreffende QA ook te vinden op het forum van Fibaro.
Zo is het mij gelukt om 2 QA's met specifieke settings te krijgen die in mijn situatie uitkomst boden.

@Soesje de nieuwe Yubii app staat weer Widgets toe in iOS18 !

[ Voor 20% gewijzigd door GeeMoney op 05-08-2025 20:51 ]


  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
@GeeMoney

Ik meende dat Joep iets met modbus deed of de tibbler dev?

  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
Jij zit vast nog wel op dat discord channel, daar lopen ze beiden
akatar schreef op dinsdag 5 augustus 2025 @ 21:35:
Jij zit vast nog wel op dat discord channel, daar lopen ze beiden
zit ik en laatst nog een balletje opgegooid maar ze doen geen rtu over tcp helaas.

  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
GeeMoney schreef op dinsdag 5 augustus 2025 @ 21:41:
[...]


zit ik en laatst nog een balletje opgegooid maar ze doen geen rtu over tcp helaas.
Ik loop er al een tijd niet meer maar kon me niet voorstellen dat ze weg zouden zijn :)

  • Hippe Lip
  • Registratie: Februari 2011
  • Laatst online: 21-09 18:05

Hippe Lip

Er valt altijd wat te leren

Hét grote voordeel van Fibaro vind ik dat het zo stabiel is. Ik heb hier een systeem van inmiddels zo’n 10 jaar oud en heb er de laatste jaren echt nix aan gedaan. Het blijft gewoon doen wat het moet doen en langzaam aan begin ik me af te vragen wanneer ik de eerste storing(en) tegen ga komen. Niet dat ik ze wens, maar gaat al zo lang goed…

En dat hoef je met Home Assistant niet te proberen. Dat gebruik ik nu ook zo’n 10 jaar, maar als ik een paar maanden geen onderhoud gepleegd heb, dan bezorg ik mezelf af en toe een flinke bult werk omdat ik uit moet zoeken welke dingen er nu weer veranderd zijn, nieuwe notaties in yaml, functies erbij maar zeker ook eraf en meer. Dat is daar nou weer wat jammer aan HA…

Verdraagzaamheid is het hoogste gebod
en wie dat niet eert die schoppen we rot.
<John O`Mill>


  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
@Hippe Lip
Same here, mijn fibaro is rock steady, mijn home assistant (yellow) is altijd wel iets mee. Zigbee stopt er elke 2 a 3 dagen wel mee, terwijl die ingebouwd zit op de yellow.

Dus hier draait alles wat belangrijk is op de hc3 en de rest op ha en hs.

  • DutchKel
  • Registratie: Mei 2002
  • Laatst online: 07:07
Ik postte in maart nog dat ik problemen had met de Philips Hue apparaten via de Hue integratie, dit heeft zichzelf automatisch opgelost met een firmware update ongeveer 1 maand geleden.

Ik had er helemaal niks meer aan gedaan totdat mijn vrouw per ongeluk op een schakelaar drukte die een aantal Philips Hue spotjes zou aanzetten. Tot onze verbazing werkte die knop ineens weer. Toen ben ik eens gaan nadenken en het enige wat ik ervoor in het weekend had gedaan was een firmware update uitgevoerd. Dus ik neem aan dat daar ook de fix bij zat voor de Philips Hue integratie.

Don't drive faster than your guardian angel can fly.


  • icecreamfarmer
  • Registratie: Januari 2003
  • Laatst online: 11:04

icecreamfarmer

en het is

Ik heb meerdere fibaro switch 2's maar bij eentje weigert hij scenes mee te sturen.
Config is hetzelfde als bij alle anderen al paar keer factory reset gedaan maar hij blijft alleen maar keyhold en keyreleased sturen. Bij alle anderen doet hij ook 2xpress en 3x press. Unit is rechtstreeks verbonden met de controller (geen hops) en config 28 en 29 staan op 15.

Iemand nog andere ideeen want met AI kom ik er ook niet meer uit.

ik zie ik zie wat jij niet ziet


  • Hippe Lip
  • Registratie: Februari 2011
  • Laatst online: 21-09 18:05

Hippe Lip

Er valt altijd wat te leren

@icecreamfarmer
Helaas geen ervaring mee. Ik heb maar één Fibaro HC2.
Heb je dit punt voorgelegd op het forum van Fibaro zelf? Dat lijkt me de geëigende plaats?

Verdraagzaamheid is het hoogste gebod
en wie dat niet eert die schoppen we rot.
<John O`Mill>


  • DutchKel
  • Registratie: Mei 2002
  • Laatst online: 07:07
Is de firmware ook hetzelfde van de switch 2?

En heb je de andere niet via de instellingen gezet op scène controller? Als ik een switch reset dan gaat die standaard op schakelaar. Ik weet niet hoe je ze instelt maar bij HC3 zit het bij het tabje geavanceerd onderaan.

Don't drive faster than your guardian angel can fly.


  • icecreamfarmer
  • Registratie: Januari 2003
  • Laatst online: 11:04

icecreamfarmer

en het is

DutchKel schreef op woensdag 1 april 2026 @ 20:52:
Is de firmware ook hetzelfde van de switch 2?

En heb je de andere niet via de instellingen gezet op scène controller? Als ik een switch reset dan gaat die standaard op schakelaar. Ik weet niet hoe je ze instelt maar bij HC3 zit het bij het tabje geavanceerd onderaan.
Ik kan het nog eens nalopen maar ze zouden allemaal hetzelfde geconfigureerd moeten zijn met momentary switches en scenes actief.

ik zie ik zie wat jij niet ziet


  • Jfwiet
  • Registratie: Juni 2002
  • Laatst online: 20-09 12:14
Firmware van de single switch is al jaren en jaren dezelfde. Dus dat zal het niet zijn. Begreep nou niet of je een HC2 of HC3 had. Je geeft aan dat de waarde van parameter 28 en 29 15 is, dat is de juiste waarde. Als je een HC3 hebt dan zie je misschien wel ergens die waarde, maar hebben ze dat niet met selectie vakjes gemaakt? (heb geen Single switch in gebruik, alleen dimmers) en dan moet je ze dus allemaal selecteren.

Je zegt ook, ik heb deze switch factory reset. De single switch is een van de meest vervelende qua drukken om in te leren enzovoort. Uitleren en inleren via de Home Center is ook altijd een volledige factory reset (edit: alle Fibaro apparaten doen een factory reset bij uitleren/inleren, producten van derden is dat niet altijd het geval). En dat is wat duidelijker met Home Center omdat die aan geeft dat er iets gebeurt is en dat is veel duidelijker dan het juiste led lichtje.

[ Voor 7% gewijzigd door Jfwiet op 02-04-2026 09:17 ]


  • icecreamfarmer
  • Registratie: Januari 2003
  • Laatst online: 11:04

icecreamfarmer

en het is

Jfwiet schreef op donderdag 2 april 2026 @ 09:16:
Firmware van de single switch is al jaren en jaren dezelfde. Dus dat zal het niet zijn. Begreep nou niet of je een HC2 of HC3 had. Je geeft aan dat de waarde van parameter 28 en 29 15 is, dat is de juiste waarde. Als je een HC3 hebt dan zie je misschien wel ergens die waarde, maar hebben ze dat niet met selectie vakjes gemaakt? (heb geen Single switch in gebruik, alleen dimmers) en dan moet je ze dus allemaal selecteren.

Je zegt ook, ik heb deze switch factory reset. De single switch is een van de meest vervelende qua drukken om in te leren enzovoort. Uitleren en inleren via de Home Center is ook altijd een volledige factory reset (edit: alle Fibaro apparaten doen een factory reset bij uitleren/inleren, producten van derden is dat niet altijd het geval). En dat is wat duidelijker met Home Center omdat die aan geeft dat er iets gebeurt is en dat is veel duidelijker dan het juiste led lichtje.
Opgelost. Had bij deze de gira pulsdrukker niet goed geïnstalleerd.
Op 1 of andere maniet kan die op 2 manieren functioneren en als je hem op de bovenste contacten aansluit dan werkt hij niet echt als pulsdrukker.

Bij alle andere wel onder aangesloten.

Blijkbaar zit er een trappenhuisfunctie op.
https://katalog.gira.de/nl-NL/datenblatt/315100

ik zie ik zie wat jij niet ziet

Het is weer even geleden maar ik heb weer een paar mooie toevoegingen en vorderingen gemaakt.

Inmiddels mijn Doorbird camera's/intercom's vervangen voor Unifi varianten. (Unifi Intercom en Unifi G4) en een robot stofzuiger met dweilfunctie opgevoerd en mijn Bellfire Mertik openhaard opgevoerd !

Voor de Unifi Intercom heb ik geen beeld binnen Fibaro maar wel kan ik de gate-hub aanspreken die gekoppeld is aan de intercom om zodoende mijn toegangshek te kunnen bedienen vanuit Fibaro.
Fibaro is daar leidend in, de status van het hek, openen en sluiten wordt allemaal door Fibaro scene's geregeld.
Unifi Geofencing gebruik ik om API calls naar de Fibaro af te vuren omdat Fibaro/Yubii en Geofencing heel slecht werkt, ben ik blijkbaar ook niet de enige in. Blijft toch gek dat ze dat soort functionaliteit niet knap krijgen.

Voor het hekwerk heb ik een QuickApp gemaakt die de diverse functies aan kan roepen:
Lua:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
-- QuickApp: UniFi Access Gate Control (3-button mode)
-- Device type: com.fibaro.multilevelSwitch (gives Open/Close/Stop-style UI)

function QuickApp:onInit()
  self:debug("UniFi Access Gate QuickApp started")

  self.host   = self:getVariable("unifi_host")    -- e.g. "192.168.1.10"
  self.port   = self:getVariable("unifi_port")    -- e.g. "12445"
  self.token  = self:getVariable("unifi_token")   -- API token
  self.doorId = self:getVariable("unifi_door_id") -- gate/door ID

  self:startStatusLoop()
  self:refreshStatus()
end

function QuickApp:startStatusLoop()
  self:refreshStatus()
  fibaro.setTimeout(30000, function()  -- polls every 30 seconds
    self:startStatusLoop()
  end)
end

-- Core call: PUT /doors/:id/unlock?control_cmd=open|close|stop
function QuickApp:sendGateCommand(cmd)
  local url = "https://" .. self.host .. ":" .. self.port ..
              "/api/v1/developer/doors/" .. self.doorId ..
              "/unlock?control_cmd=" .. cmd

  local http = net.HTTPClient()
  http:request(url, {
    options = {
      method = "PUT",
      headers = {
        ["Authorization"] = "Bearer " .. self.token,
        ["Content-Type"]  = "application/json"
      },
      data = json.encode({
        actor_name = "Fibaro HC3",
        actor_id   = "fibaro-hc3-gate"
      }),
      checkCertificate = false,  -- self-signed local cert
      timeout = 5000
    },
    success = function(response)
      self:debug("Gate " .. cmd .. " -> " .. response.status .. " " .. response.data)
            -- Update the global variable based on the command sent
      if cmd == "close" then
        fibaro.setGlobalVariable("Toegangshek", "Closing")
        self:updateView("gateStatus", "text", "Hekwerk is gesloten")
        self:updateProperty("log", "Status: Gesloten")
        fibaro.setTimeout(26000, function()
        fibaro.setGlobalVariable("Toegangshek", "Closed")  
        end)
      elseif cmd == "open" then
        fibaro.setGlobalVariable("Toegangshek", "Opening")
        self:updateView("gateStatus", "text", "Hekwerk is open")
        self:updateProperty("log", "Status: Open")
        fibaro.setTimeout(26000, function()
        self:sendGateCommand("stop")
        end)
        fibaro.setTimeout(260000, function()
        fibaro.setGlobalVariable("Toegangshek", "Open")  
        end)
      elseif cmd == "stop" then
        self:refreshStatus()  
        fibaro.setTimeout(130000, function()
        self:refreshStatus()  
        end)
      end
      
      self:refreshStatus()
    end,
    error = function(err)
      self:error("Gate " .. cmd .. " failed: " .. err)
    end
  })
end

function QuickApp:refreshStatus()
    local status = fibaro.getGlobalVariable("Toegangshek")
    if status == "Closed" then
        self:updateProperty("secured", 255)
        self:updateProperty("log", "Status: Gesloten")
    else
        self:updateProperty("secured", 0)
        self:updateProperty("log", "Status: Open")
    end
end
-- === UI Action Handlers ===
function QuickApp:turnOn()   -- "Open" button
  self:trace("Open pressed")
  self:sendGateCommand("open")
end

function QuickApp:turnOff()  -- "Close" button
  self:trace("Close pressed")
  self:sendGateCommand("close")
end

function QuickApp:stop()     -- "Stop" button (add as custom action in QuickApp UI)
  self:trace("Stop pressed")
  self:sendGateCommand("stop")
end

-- Compatibility handler for integrations/scenes that call "secure"
function QuickApp:secure()
  self:trace("Secure/Open pressed")
  self:sendGateCommand("close")
end

-- Compatibility handler for integrations/scenes that call "unsecure"
function QuickApp:unsecure()
  self:trace("Secure/Open pressed")
  self:sendGateCommand("open")
end
In mijn geval laat ik mijn hek open als er iemand thuis is, vandaar de actie "open" en 26seconden later de stop functie. Dit zorgt ervoor dat mijn hek open blijft, daarbij zet ik dus een global variabele om binnen Fibaro om zodoende een actuele status te hebben die je makkelijk kan gebruiken. (Ik heb een automatische scène die Unifi raadpleegt of devices aanwezig zijn en die moet niet te snel triggeren anders sluit hij direct het hek weer. Er zit dus bewust een korte delay tussen status “opening” en “open” .

Onderstaande code heb ik gebruikt om mijn Mertik Wifi adapter van mijn gashaard aan te sturen. Die doet exact hetzelfde als de Wi-Fi app/afstandsbediening.
Er zit een auto off timer in die je middels een QuickApp variabele zelf kan beïnvloeden maar default staat hij op 120 minuten, dan gaat de haard uit tenzij je tussentijds vlamhoogte aanpast, dan telt hij weer opnieuw af. (Het is meer uit veiligheid)
Daarnaast heb ik een extra scene gemaakt die de woonkamer thermostaat in de gaten houd en bij warmer dan 23 graden en/of openhaard aan een push notificatie stuurt of het klopt en of hij anders de haard moet uitschakelen.
Lua:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
----------------------------------------------------------------------------------
-- Mertik Wi-Fi for Barbas Bellfires fireplace integration
-- Version 0.0.8 (cleaned up: single-shot on/off, persistent socket, auto-off)
----------------------------------------------------------------------------------
-- DISCLAIMER:
-- USING THIS QUICK APP IS ENTIRELY AT YOUR OWN RISK! CONTROLLING A GAS FIREPLACE
-- WITH REVERSED ENGINEERED CODE CAN CAUSE UNEXPECTED BEHAVIOR!
----------------------------------------------------------------------------------
__TAG = "QA" .. plugin.mainDeviceId
_VERSION = "0.08"

PREFIX = "0233303330333033303830"

function string.fromhex(str)
  return (str:gsub('..', function (cc) return string.char(tonumber(cc, 16)) end))
end

function string.tohex(str)
  return (str:gsub('.', function (c) return string.format('%02X', string.byte(c)) end))
end

function bufferFrom(str,base)
  return str:gsub("(%d%d)",function(d) return string.char(tonumber(d,base)) end)
end

-- Sends a command over a persistent, reused TCP socket (reconnected on each
-- call). This connection style is required by the receiver - a fresh socket
-- per command was tried and did not reliably work.
function QuickApp:send(strToSend, callback)
  self.sock:connect(self.IPv4, 2000, {
    success = function()
      self:debug("Connected to Mertik Wi-Fi device...")
      self.sock:write(strToSend, {
        success = function()
          self:debug("Data sent to device...")
          self.sock:read({
            success = function(data)
              self:debug("Response: " .. tostring(data))
              self.sock:close()
              if callback then callback(true, data) end
            end,
            error = function(err)
              self:error("Error reading data: ", err)
              self.sock:close()
              if callback then callback(false, err) end
            end
          })
        end,
        error = function(err)
          self:error("Error while sending data: ", err)
          if callback then callback(false, err) end
        end
      })
    end,
    error = function(message)
      self:error("Connection error: ", message)
      if callback then callback(false, message) end
    end,
  })
end

-- Builds a flame-height command. level: 0 (off) to 10 (max).
-- On this receiver, level 0 fully closes the gas valve when sent as a single
-- isolated command - it must NOT be preceded by other flame-height commands
-- in quick succession (a stepped ramp-down was tried and did not reliably
-- close the valve, likely due to rapid reconnects on the shared socket).
function QuickApp:buildFlameCommand(level)
  level = math.max(0, math.min(10, math.floor(level)))
  local levelChar = string.format("%X", level)              -- '0'-'9' or 'A'
  local levelCode = string.format("%02X", string.byte(levelChar))
  local msg = "31" .. levelCode .. "03"
  return bufferFrom(PREFIX .. msg, 16)
end

function QuickApp:setFlameHeight(level, callback)
  self:debug("Setting flame height to level " .. level .. "/10")
  local packet = self:buildFlameCommand(level)
  self:send(packet, function(ok, data)
    if ok then
      self.currentLevel = level
      self:updateProperty("value", level * 10)  -- reflect as 0-100 for a slider UI
    else
      self:error("Failed to set flame height to " .. level .. ": " .. tostring(data))
    end
    if callback then callback(ok) end
  end)
end

-- ===== Auto-off timer =====
-- Uses a generation counter instead of relying on a timer-cancel API, so it
-- works reliably regardless of firmware quirks: every time a new timer is
-- scheduled, the generation increments, and any older pending callback checks
-- whether it's still current before firing. This makes "reschedule" and
-- "cancel" both trivial and safe even with several rapid calls in a row.
function QuickApp:scheduleAutoOff()
  self.autoOffGen = (self.autoOffGen or 0) + 1
  local myGen = self.autoOffGen
  local minutes = tonumber(self:getVariable("AutoOffMinutes")) or 0
  if minutes > 0 then
    self:debug("Auto-off scheduled in " .. minutes .. " minute(s)")
    fibaro.setTimeout(minutes * 120 * 1000, function()
      if myGen == self.autoOffGen then
        self:debug("Auto-off timer fired, turning fireplace off")
        self:turnOff()
      end
    end)
  end
end

function QuickApp:cancelAutoOff()
  self.autoOffGen = (self.autoOffGen or 0) + 1  -- invalidates any pending timer
end

-- Callable action to set/select the auto-off duration (minutes). 0 disables it.
-- Wire this to a UI select/button row (callback name "setAutoOff") if your
-- QuickApp interface supports it, or just edit the AutoOffMinutes QuickApp
-- Variable directly from the device's Variables panel.
function QuickApp:setAutoOff(minutes)
  minutes = tonumber(minutes) or 0
  self:setVariable("AutoOffMinutes", tostring(minutes))
  self:debug("Auto-off set to " .. minutes .. " minute(s)" .. (minutes == 0 and " (disabled)" or ""))
  -- If the fireplace is currently on, apply the new duration immediately.
  if (self.currentLevel or 0) > 0 then
    self:scheduleAutoOff()
  end
end

function QuickApp:turnOn()
  self:debug("Turn fireplace on and set max flame height...")
  self:setFlameHeight(10)
  self:scheduleAutoOff()
end

function QuickApp:turnOff()
  self:debug("Turn fireplace off...")
  self:cancelAutoOff()
  self:setFlameHeight(0, function(ok)
    if not ok then
      self:error("Turn-off command failed to send/confirm - flame may not be off. Retry manually.")
    end
  end)
end

-- Fires when the flame-height slider moves (needs device type com.fibaro.multilevelSwitch)
function QuickApp:setValue(value)
  local level = math.floor((tonumber(value) or 0) / 10)  -- map 0-100 slider to 0-10 protocol levels
  self:setFlameHeight(level)
  if level > 0 then
    self:scheduleAutoOff()
  else
    self:cancelAutoOff()
  end
end

function QuickApp:onInit()
  self:debug("Mertik Wi-Fi for Barbas Bellfires fireplace integration v" .. _VERSION)
  self.IPv4 = self:getVariable("IPv4")
  self.sock = net.TCPSocket()
  self.currentLevel = 0
  self.autoOffGen = 0
  -- One-time migration: force AutoOffMinutes to 60 the first time this
  -- version runs, even if it already existed (e.g. as "0" from earlier
  -- testing). After this runs once, it's never touched again automatically -
  -- so if you later set it to 0 yourself to disable auto-off, it'll stay 0.
  if self:getVariable("AutoOffDefaultApplied") == "" then
    self:setVariable("AutoOffMinutes", "120")
    self:setVariable("AutoOffDefaultApplied", "yes")
    self:debug("Applied one-time default: AutoOffMinutes = 120")
  end
  -- Reflect the current value in a UI select/slider if one is bound. Replace
  -- "autoOffSelect" with your actual UI element's name from the Interface tab.
  -- This is wrapped in pcall since it will error harmlessly if no such
  -- element exists yet.
  pcall(function()
    self:updateView("autoOffSelect", "value", self:getVariable("AutoOffMinutes"))
  end)
end
De Dreame QA ben ik nog aan het testen maar die gebruikt HA om de diverse functies aan te spreken.
Plaatjes van de devices:
Afbeeldingslocatie: https://tweakers.net/i/3pIyvZMYV1E1bRgXINMj7Y8GRt8=/232x232/filters:strip_exif()/f/image/z7F9eF6EBlqPfwcRJp7VwaAj.png?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/_e-ZGeKrRFI6lq1OmTD1ZVp0LbA=/232x232/filters:strip_exif()/f/image/RriunXrVKcrkiwvYeky60TnO.png?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/xtCIHruG723G9Ezeny8QzjB2Lsg=/232x232/filters:strip_exif()/f/image/F485Q6P7fpHrnRv9bRZ1dRW6.png?f=fotoalbum_tile
Afbeeldingslocatie: https://tweakers.net/i/Q5P2BdFlMH7MuWp_kICqzxl_Aro=/232x232/filters:strip_exif()/f/image/rdCTq2qfLknsWTHIVygR07qL.png?f=fotoalbum_tileAfbeeldingslocatie: https://tweakers.net/i/rObVimNcPDbKzlx7iO-X_ZunrtA=/232x232/filters:strip_exif()/f/image/TnmUCJD1vgt82jmR4ukIvDXu.png?f=fotoalbum_tile

[ Voor 14% gewijzigd door GeeMoney op 16-09-2026 23:39 ]


  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
@GeeMoney

Goed bezig!

Als Fibaro een keer een grote stap voorwaarts wil maken mogen ze wel een keer beginnen/opschieten met matter ondersteuning, of misschien dat dit een sellingpoint wordt voor home center 4?

  • Hippe Lip
  • Registratie: Februari 2011
  • Laatst online: 21-09 18:05

Hippe Lip

Er valt altijd wat te leren

akatar schreef op donderdag 17 september 2026 @ 14:46:
@GeeMoney

Goed bezig!

Als Fibaro een keer een grote stap voorwaarts wil maken mogen ze wel een keer beginnen/opschieten met matter ondersteuning, of misschien dat dit een sellingpoint wordt voor home center 4?
Dat doet me denken aan de vraag hoe dat gaat bij een overstap. Ik gebruik nu al ruim 10 jaar een HC2. Als ik naar een nieuw model zou overstappen, moet ik daar dan alles opnieuw met de hand in zetten? Er zijn nogal wat componenten in inbouwdozen ingebouwd en die moet ik dan allemaal openmaken om te resetten en bij de nieuwe HC aanmelden?
En alle programmeringen en zo moet ik handmatig opnieuw opbouwen?

Ik verbaas me er al jaren over dat er geen externe back-up te maken is. Hoe mooi zou het zijn als die wel te maken is en dat die dan bovendien in te lezen is in een andere/ nieuwe HC?

Verdraagzaamheid is het hoogste gebod
en wie dat niet eert die schoppen we rot.
<John O`Mill>

Hippe Lip schreef op donderdag 17 september 2026 @ 20:50:
[...]

Dat doet me denken aan de vraag hoe dat gaat bij een overstap. Ik gebruik nu al ruim 10 jaar een HC2. Als ik naar een nieuw model zou overstappen, moet ik daar dan alles opnieuw met de hand in zetten? Er zijn nogal wat componenten in inbouwdozen ingebouwd en die moet ik dan allemaal openmaken om te resetten en bij de nieuwe HC aanmelden?
En alle programmeringen en zo moet ik handmatig opnieuw opbouwen?

Ik verbaas me er al jaren over dat er geen externe back-up te maken is. Hoe mooi zou het zijn als die wel te maken is en dat die dan bovendien in te lezen is in een andere/ nieuwe HC?
Externe back-up kan wel op de HC3 en ook inlezen maar van een HC2 naar HC3 moet je naar mijn weten al je devices inderdaad opnieuw inleren.
vanaf een bepaalde firmware op je HC2 en HC3 is er een migratie optie!
Wel met wat nadelen. Zoals ik hieronder al schreef kunnen scene's en virtual devices niet mee.
Ook is de migratie onomkeerbaar, eenmaal naar de HC3 kun je dus niet meer terug.

Scenes en virtual devices en lua zijn heel anders en kunnen daarom niet 1 op 1 over.

Ik heb destijds ervoor gekozen om opnieuw te beginnen en alles goed na te lopen wat ik wel en niet wilde meenemen of zaken die ik gelijk aan wilde pakken om te verbeteren.

[ Voor 11% gewijzigd door GeeMoney op 17-09-2026 21:17 ]


  • Hippe Lip
  • Registratie: Februari 2011
  • Laatst online: 21-09 18:05

Hippe Lip

Er valt altijd wat te leren

GeeMoney schreef op donderdag 17 september 2026 @ 21:11:
[...]
vanaf een bepaalde firmware op je HC2 en HC3 is er een migratie optie!
Vanaf welke FW? En is elke HC2 daarnaar te upgraden?

Waar vind ik meer info daarover?

Verdraagzaamheid is het hoogste gebod
en wie dat niet eert die schoppen we rot.
<John O`Mill>


  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
Hippe Lip schreef op donderdag 17 september 2026 @ 20:50:
[...]

Dat doet me denken aan de vraag hoe dat gaat bij een overstap. Ik gebruik nu al ruim 10 jaar een HC2. Als ik naar een nieuw model zou overstappen, moet ik daar dan alles opnieuw met de hand in zetten? Er zijn nogal wat componenten in inbouwdozen ingebouwd en die moet ik dan allemaal openmaken om te resetten en bij de nieuwe HC aanmelden?
En alle programmeringen en zo moet ik handmatig opnieuw opbouwen?

Ik verbaas me er al jaren over dat er geen externe back-up te maken is. Hoe mooi zou het zijn als die wel te maken is en dat die dan bovendien in te lezen is in een andere/ nieuwe HC?
Je moet voor jezelf eens nadenken of je het de moeite waard vind, volgens mij heeft de hc2 een zwave 300 chip en de hc3 een 500, hiermee zijn er meer mogelijkheden zoals is er bv het centralscene command beschikbaar.

Tevens heeft de hc2 ook niet het eeuwige leven en kan je of overgaan in je eigen tempo of wachten tot deze het begeeft en dan moet alles ineens snel gebeuren.

  • Hippe Lip
  • Registratie: Februari 2011
  • Laatst online: 21-09 18:05

Hippe Lip

Er valt altijd wat te leren

Precies omdat mijn HC2 al ruim 10 jaar oud is, zit ik na te denken wat ik wil: verder (en dan met een HC3) of stoppen. Ik gebruik er steeds minder van.

Een heleboel dingen doe ik op Home Assistant. Het voordeel daarvan is dat het veel flexibeler is en veel meer kan. Ik heb daar inmiddels zó veel op gebouwd dat ik echt niet meer zonder kan.
Het nadeel is dat het bepaald geen ‘set-and-forget’ systeem is, wat de Fibaro HC2/3 wel is.

Twijfel alom dus.

Verdraagzaamheid is het hoogste gebod
en wie dat niet eert die schoppen we rot.
<John O`Mill>


  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
@Hippe Lip

Dat is ook het voordeel van een homecenter, set and forget. Homeassistant is een beetje een dreinend kind, als je er een tijdje geen aandacht aan besteed, gaat het mis. (ik gebruik ook beide)

  • Hippe Lip
  • Registratie: Februari 2011
  • Laatst online: 21-09 18:05

Hippe Lip

Er valt altijd wat te leren

@akatar
En zo vullen die twee elkaar aan én verschillen ze als dag en nacht op een heleboel punten.

Verdraagzaamheid is het hoogste gebod
en wie dat niet eert die schoppen we rot.
<John O`Mill>

@Hippe Lip daarom heb ik ze ook beide maar ik probeer primair Fibaro zoveel mogelijk in te zetten en gebruik HA alleen als “proxy” voor functionaliteit die niet/lastig in Fibaro te krijgen is wegens gebrek aan ondersteuning van bijvoorbeeld authenticatiemiddelen richting bekende cloud diensten.
Mijn Dreame/Segway bijvoorbeeld (oAuth)en mijn thuis thermostaten lopen weer over Ramses-II via een USB gateway dat soort zaken is onmogelijk naar Fibaro te brengen.

Ik gebruik dus ook een combinatie maar vind de stabiliteit en “simpele” interface van de Fibaro veel handiger dan continu die breaking changes in HA na zowat elke update.

Vereiste firmware levels zijn trouwens:
HC2 needs to be on firmware 4.581 Beta or newer, the HC3 needs to be at 5.021.38 or newer.

[ Voor 26% gewijzigd door GeeMoney op 19-09-2026 13:31 ]


  • Hippe Lip
  • Registratie: Februari 2011
  • Laatst online: 21-09 18:05

Hippe Lip

Er valt altijd wat te leren

@GeeMoney
Ik zit op V4.630, dus die backup zou moeten lukken. Binnenkort dan toch maar eens tijd aan spenderen om uit te zoeken hoe.

Afbeeldingslocatie: https://tweakers.net/i/gRjRw1wkgDvlWaYc7Lh6LCdqxac=/800x/filters:strip_icc():strip_exif()/f/image/zZyM213yn2avsBdmMomxJMzE.jpg?f=fotoalbum_large

Verdraagzaamheid is het hoogste gebod
en wie dat niet eert die schoppen we rot.
<John O`Mill>

Hier is dan de Dreame QA die dus naar HomeAssistant kijkt en uiteindelijk daar de settings doorvoert om de robotstofzuiger aan het werk te zetten.
Het is helaas niet mogelijk om binnen de QA de Dreame cloud service rechtstreeks aan te spreken.

Vanwege het formaat moet ik hem opknippen:
Ik heb 2 global variabele. Mijn HA_IP en mijn HA_Bearer . Staan verderop in de code.
Ik heb die in een globale var gezet zodat ik hem vanuit elk script aan kan roepen en ik hem maar op 1 plek hoef te wijzigen.
Daarnaast zie je bovenin de vacuüm.stoffie . stoffie zo heet mijn dreame, die entity zal je dus even uit HA moeten halen.
Daarnaast is het makkelijk om een Debug knop aan te maken, die zit ook in de code en dan kan je heel makkelijk alle return codes zien en/of errors.

Veel zaken zijn makkelijk te controleren in je HA door even naar Settings -> Developer Tools -> States te gaan en dan je entity of sensor in te kloppen. Dan krijg je alle opties te zien.
Lua:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
--[[
=======================================================================
 Dreame Vacuum <-> Home Assistant QuickApp for Fibaro HC3
=======================================================================
 What this does:
   - Polls a Home Assistant "vacuum" entity (your Dreame robot, exposed
     via the HACS Dreame integration) over the HA REST API.
   - Shows: current status, whether it's cleaning, whether it's
     mopping, whether the current run was started by a schedule,
     battery level, and (optionally) whether it needs maintenance
     (low consumables: brushes / filter / mop pads).
   - Buttons to Start / Pause / Return to dock.
   - A Debug button that dumps the full raw entity JSON to the log,
     so you can find the exact attribute names your integration uses.

 SETUP:
   1. Create a new QuickApp on your HC3 (Devices -> + -> Add device ->
      Other devices -> Generic Device), then replace the default
      template code with this whole file, and Save.
   2. The header --%%u: lines at the top are NOT reliably auto-applied
      by every HC3 firmware when pasting into a fresh Generic Device
      template. If, after saving, the device has no label/buttons,
      add them manually in the device's UI editor (not the code tab):
        - six LABELS with ids: status, cleaning, mopping, scheduled,
          battery, attention (each on its own line/row of the UI)
        - a row of BUTTONS with ids: startCleaning, pauseCleaning,
          returnToDock (each wired to call the QuickApp method of the
          same name on click / onReleased)
        - a row of MODE BUTTONS: setModeSweep, setModeMop, setModeBoth
          (optionally also setModeMopAfterSweep), wired the same way
        - a row of ROOM BUTTONS: one per room you want a quick-clean
          button for, e.g. cleanOffice, cleanLivingRoom, cleanKitchen
          (add more by copying the pattern in the code + a button)
        - one BUTTON with id: debugDump (wired the same way)
   3. Fill in the variables in the "USER CONFIG" section below.
   4. Save & Start/Restart the QuickApp. Check the log for the first
      poll result; the label should populate within a few seconds.
   5. If "Mopping" / "Scheduled" don't reflect reality, press the
      "Debug: dump entity" button, look at the logged JSON, and
      tell me the attribute + value you see, so I can tune the
      matching logic to your integration.
=======================================================================
]]

--%%name:Dreame Vacuum (HA)
--%%type:com.fibaro.genericDevice
-- NOTE: --%%u: UI-generating header lines were intentionally removed.
-- On this firmware they appear to get (re-)applied on code save and
-- can create duplicate UI elements that collide with ones configured
-- manually in the device's UI editor, causing button taps to silently
-- do nothing. All UI elements for this QuickApp must be added by hand
-- in the UI editor - see the SETUP notes above.

-------------------------------------------------------------------
-- USER CONFIG - fill these in
-------------------------------------------------------------------
-- HA_IP and HA_Bearer are NOT set here - they are read from HC3
-- Global Variables (Panels -> Variables) named "HA_IP" and
-- "HA_Bearer". Create those two global variables on your HC3 first
-- and fill them with your Home Assistant IP and Long-Lived Access
-- Token respectively.
local HA_PORT      = "8123"                  -- Home Assistant port

-- The Dreame vacuum's object_id in Home Assistant - i.e. whatever
-- comes after "vacuum." in its entity id (vacuum.stoffie -> "stoffie").
-- All other entity ids below (select, sensors) are derived from this
-- automatically, since the Dreame HACS integration names every
-- related entity "<domain>.<VACUUM_NAME>_<thing>".
local VACUUM_NAME = "stoffie"

local VACUUM_ENTITY             = "vacuum." .. VACUUM_NAME
local CLEANING_MODE_ENTITY      = "select." .. VACUUM_NAME .. "_cleaning_mode"
local SUCTION_LEVEL_ENTITY      = "select." .. VACUUM_NAME .. "_suction_level"
local CLEANING_ROUTE_ENTITY     = "select." .. VACUUM_NAME .. "_cleaning_route"
local SELECTED_MAP_ENTITY       = "select." .. VACUUM_NAME .. "_selected_map"
local CLEANING_PROGRESS_ENTITY  = "sensor." .. VACUUM_NAME .. "_cleaning_progress"
local SELF_CLEAN_TIME_ENTITY    = "number." .. VACUUM_NAME .. "_self_clean_time"

local HA_USE_HTTPS         = true   -- true = https://, false = http://
local HA_IGNORE_CERT_ERRORS = true  -- set true if HA uses a self-signed certificate

local HA_SCHEME = HA_USE_HTTPS and "https" or "http"

-- Optional: consumable/maintenance sensors exposed by the integration.
-- Leave the table empty ( {} ) to skip maintenance checking entirely.
-- Derived from VACUUM_NAME the same way - uncomment the ones you want.
local CONSUMABLE_ENTITIES = {
  ["Main brush"] = "sensor." .. VACUUM_NAME .. "_main_brush_time_left",
  ["Side brush"] = "sensor." .. VACUUM_NAME .. "_side_brush_time_left",
  ["Filter"]     = "sensor." .. VACUUM_NAME .. "_filter_time_left",
  ["Sensor"]     = "sensor." .. VACUUM_NAME .. "_sensor_dirty_time_left",
  ["Wheel"]      = "sensor." .. VACUUM_NAME .. "_wheel_dirty_time_left",
}
local MAINTENANCE_THRESHOLD = 10  -- % remaining life below which we flag "needs attention"

-- IDs of the 3 dropdown ("Select") UI elements you added, so we can
-- push the vacuum's *current* setting into them on every poll (and
-- right after you change one). These must exactly match the "ID"
-- field you set for each dropdown in the UI editor - e.g. the
-- default auto-generated ones look like "select_ID_10". Check yours
-- and update these three lines to match.
local CLEANING_MODE_UI_ID  = "select_ID_10"
local SUCTION_LEVEL_UI_ID  = "select_ID_11"
local CLEANING_ROUTE_UI_ID = "select_ID_12"
local SELECTED_MAP_UI_ID   = "select_ID_13" 

-- ID of an OPTIONAL slider UI element for mop washing time (10-50
-- minutes, per your device's min/max). Only needed if you add a
-- Slider element - the preset buttons below work without it.
local SELF_CLEAN_TIME_UI_ID = "selfCleanTimeSlider"

-- This firmware's Slider element is fixed at a 0-100 range with no
-- editable min/max, but the real device only accepts 10-50 minutes.
-- These two functions map between the slider's 0-100 position and
-- the actual minutes value, so slider-left = 10 min, slider-right =
-- 50 min, instead of most of the slider's travel being invalid.
local SELF_CLEAN_TIME_MIN = 10
local SELF_CLEAN_TIME_MAX = 50

local function sliderToMinutes(sliderValue)
  sliderValue = math.max(0, math.min(100, tonumber(sliderValue) or 0))
  local minutes = SELF_CLEAN_TIME_MIN + (sliderValue / 100) * (SELF_CLEAN_TIME_MAX - SELF_CLEAN_TIME_MIN)
  return math.floor(minutes + 0.5)
end

local function minutesToSlider(minutes)
  minutes = tonumber(minutes) or SELF_CLEAN_TIME_MIN
  local sliderValue = (minutes - SELF_CLEAN_TIME_MIN) / (SELF_CLEAN_TIME_MAX - SELF_CLEAN_TIME_MIN) * 100
  return math.floor(sliderValue + 0.5)
end

-- Room name -> segment id, GROUPED BY MAP/FLOOR, since the same
-- room name can have a different segment id per floor (e.g.
-- "Corridor" exists on all 3 floors with different ids). The outer
-- keys must exactly match the "Map/floor" dropdown's option values
-- (select.<name>_selected_map). Segment ids come straight from the
-- "rooms" attribute of the vacuum entity - re-check there if you
-- rename/add rooms on the robot later.
local ROOMS_BY_MAP = {
  ["Begane Grond"] = {
    ["Office"]      = 1,
    ["Living Room"] = 2,
    ["Corridor"]    = 3,
    ["Dining Hall"] = 4,
    ["Kitchen"]     = 5,
  },
  ["1ste verdieping"] = {
    ["Slaapkamer 1"]  = 1,
    ["Slaapkamer 2"] = 3,
    ["Slaapkamer 3"]   = 4,
    ["Corridor"]          = 5,
    ["Bathroom"]          = 6,
  },
  ["2e verdieping"] = {
    ["Bathroom"]          = 1,
    ["Corridor"]          = 2,
    ["Closet"]            = 3,
    ["Ouders Slaapkamer"] = 4,
  },
}

local POLL_INTERVAL = 20  -- seconds between polls
-------------------------------------------------------------------


-- Like self:updateView, but silently does nothing if the target UI
-- element doesn't exist (e.g. you removed an optional label/dropdown
-- from the UI editor). Prevents log warnings from piling up.
function QuickApp:safeUpdateView(id, prop, value)
  pcall(function() self:updateView(id, prop, value) end)
end

function QuickApp:onInit()
  self:debug("Dreame HA QuickApp starting...")
  self.http = net.HTTPClient()

  -- Read connection details from HC3 Global Variables instead of
  -- hardcoding them in the code.
  self.ipaddr = hub.getGlobalVariable("HA_IP")
  self.token  = hub.getGlobalVariable("HA_Bearer")

  if not self.ipaddr or self.ipaddr == "" then
    self:error("Global Variable 'HA_IP' is missing or empty - please create/fill it")
  end
  if not self.token or self.token == "" then
    self:error("Global Variable 'HA_Bearer' is missing or empty - please create/fill it")
  end

  self.info = {
    status = "-", cleaning = "-", mopping = "-",
    scheduled = "-", battery = "-", attention = "n/a", mode = "-",
    selfCleanTime = "-", map = "-"
  }
  self:renderLabel()
  self:updateData()
end

-- Pushes each field to its own label. Labels don't render HTML in
-- this widget, so we use separate label elements instead of <br>.
function QuickApp:renderLabel()
  local i = self.info
  self:safeUpdateView("status", "text", "Status: " .. tostring(i.status))
  self:safeUpdateView("mode", "text", "Program: " .. tostring(i.mode))
  self:safeUpdateView("cleaning", "text", "Cleaning: " .. tostring(i.cleaning))
  self:safeUpdateView("mopping", "text", "Mopping: " .. tostring(i.mopping))
  self:safeUpdateView("scheduled", "text", "Scheduled task: " .. tostring(i.scheduled))
  self:safeUpdateView("battery", "text", "Battery: " .. tostring(i.battery) .. "%")
  self:safeUpdateView("attention", "text", "Needs attention: " .. tostring(i.attention))
  self:safeUpdateView("washTime", "text", "Mop wash time: " .. tostring(i.selfCleanTime) .. " min")
  self:safeUpdateView("map", "text", "Map/floor: " .. tostring(i.map))
end

-------------------------------------------------------------------
-- Generic HA REST helpers
-------------------------------------------------------------------

function QuickApp:haGet(path, callback)
  local url = HA_SCHEME .. "://" .. self.ipaddr .. ":" .. HA_PORT .. "/api/" .. path
  self.http:request(url, {
    options = {
      method = "GET",
      checkCertificate = not HA_IGNORE_CERT_ERRORS,
      headers = {
        ["Authorization"] = "Bearer " .. self.token,
        ["Content-Type"] = "application/json"
      }
    },
    success = function(response)
      if response.status == 200 then
        local ok, data = pcall(json.decode, response.data)
        if ok then
          callback(data)
        else
          self:error("JSON decode error on " .. path .. ": " .. tostring(data))
          callback(nil)
        end
      else
        self:error("HA API GET " .. path .. " returned status " .. tostring(response.status))
        callback(nil)
      end
    end,
    error = function(err)
      self:error("HA API GET " .. path .. " failed: " .. tostring(err))
      callback(nil)
    end
  })
end

function QuickApp:haCallService(domain, service, entityId, extra)
  local url = HA_SCHEME .. "://" .. self.ipaddr .. ":" .. HA_PORT .. "/api/services/" .. domain .. "/" .. service
  local body = { entity_id = entityId }
  if extra then
    for k, v in pairs(extra) do body[k] = v end
  end
  local payload = json.encode(body)
  self.http:request(url, {
    options = {
      method = "POST",
      checkCertificate = not HA_IGNORE_CERT_ERRORS,
      headers = {
        ["Authorization"] = "Bearer " .. self.token,
        ["Content-Type"] = "application/json"
      },
      data = payload
    },
    success = function(response)
      self:debug("Called service " .. domain .. "." .. service .. " -> status " .. tostring(response.status))
      -- refresh state shortly after issuing a command
      fibaro.setTimeout(2500, function() self:updateData() end)
    end,
    error = function(err)
      self:error("Service call " .. domain .. "." .. service .. " failed: " .. tostring(err))
    end
  })
end
Lua:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
-------------------------------------------------------------------
-- Main polling / status logic
-------------------------------------------------------------------

function QuickApp:updateData()
  self:haGet("states/" .. VACUUM_ENTITY, function(data)
    if data then
      self:processVacuumState(data)
    end
    self:checkMaintenance()
  end)

  self:syncSelectDropdowns()
  self:syncSelfCleanTime()

  -- schedule next poll
  fibaro.setTimeout(POLL_INTERVAL * 1000, function() self:updateData() end)
end

-- Fetches the current mop washing/self-clean time (minutes) and
-- reflects it in the label and (if you added one) the slider.
function QuickApp:syncSelfCleanTime()
  self:haGet("states/" .. SELF_CLEAN_TIME_ENTITY, function(data)
    if data and data.state then
      self.info.selfCleanTime = data.state
      self:safeUpdateView(SELF_CLEAN_TIME_UI_ID, "value", tostring(minutesToSlider(data.state)))
      self:renderLabel()
    end
  end)
end

-- Fetches the current value of the 3 select entities (cleaning mode,
-- suction level, cleaning route) and pushes it into the matching
-- dropdown UI element, so the dropdowns always reflect what's
-- actually set on the robot - whether changed from this QuickApp,
-- the Dreame app, an automation, or a schedule.
function QuickApp:syncSelectDropdowns()
  self:haGet("states/" .. CLEANING_MODE_ENTITY, function(data)
    if data and data.state then
      self:safeUpdateView(CLEANING_MODE_UI_ID, "value", data.state)
      self.info.mode = data.state
      self:renderLabel()
    end
  end)
  self:haGet("states/" .. SUCTION_LEVEL_ENTITY, function(data)
    if data and data.state then
      self:safeUpdateView(SUCTION_LEVEL_UI_ID, "value", data.state)
    end
  end)
  self:haGet("states/" .. CLEANING_ROUTE_ENTITY, function(data)
    if data and data.state then
      self:safeUpdateView(CLEANING_ROUTE_UI_ID, "value", data.state)
    end
  end)
  self:haGet("states/" .. SELECTED_MAP_ENTITY, function(data)
    if data and data.state then
      self:safeUpdateView(SELECTED_MAP_UI_ID, "value", data.state)
      self.info.map = data.state
      self:renderLabel()
    end
  end)
end

function QuickApp:processVacuumState(data)
  local state = tostring(data.state or "unknown")
  local attr = data.attributes or {}

  -- Is it actively cleaning at all?
  -- HA "vacuum" domain standard states: cleaning, docked, idle, paused,
  -- returning, error. Some Dreame integrations also report the more
  -- detailed status inside attributes (e.g. attr.status).
  local detailedStatus = tostring(attr.status or attr.cleaning_mode or state):lower()
  local isCleaning = (state == "cleaning") or detailedStatus:find("clean") ~= nil
                       or detailedStatus:find("sweep") ~= nil or detailedStatus:find("mop") ~= nil

  -- Is it mopping? Dreame integrations typically expose this via
  -- attr.cleaning_mode or attr.status with values like "mopping" /
  -- "sweeping_and_mopping".
  local modeString = tostring(attr.cleaning_mode or attr.status or ""):lower()
  local isMopping = isCleaning and modeString:find("mop") ~= nil

  -- Was the current run started by a schedule?
  -- Common attribute names seen across integrations: started_by,
  -- start_type, cleaning_start_type. Values often include "schedule"
  -- or "timer".
  local startedBy = tostring(attr.started_by or attr.start_type or attr.cleaning_start_type or ""):lower()
  local isScheduled = isCleaning and (startedBy:find("sched") ~= nil or startedBy:find("timer") ~= nil)

  -- Battery
  local battery = attr.battery_level or attr.battery or "?"

  self.info.status    = attr.status and tostring(attr.status) or state
  self.info.cleaning  = isCleaning and "Yes" or "No"
  self.info.mopping   = isMopping and "Yes" or "No"
  self.info.scheduled = isScheduled and "Yes" or "No"
  self.info.battery   = tostring(battery)
  self:renderLabel()

  -- Store latest known values for use by updateLog()
  self.isCleaning     = isCleaning
  self.isMopping      = isMopping
  self.currentStatus  = self.info.status
  self.currentBattery = battery

  self:updateLog()

  self:debug(string.format(
    "state=%s status=%s cleaning=%s mopping=%s startedBy=%s battery=%s",
    state, tostring(attr.status), tostring(isCleaning), tostring(isMopping),
    tostring(startedBy), tostring(battery)
  ))
end

-- Updates the short status line shown directly on the device tile on
-- the dashboard (not just inside the detail view). While a clean is
-- running, it also fetches the live cleaning progress sensor and
-- appends it, e.g. "Cleaning - 84% (mopping) 42% done".
function QuickApp:updateLog()
  local logLine = tostring(self.currentStatus) .. " - " .. tostring(self.currentBattery) .. "%"

  if not self.isCleaning then
    self:updateProperty("log", logLine)
    return
  end

  logLine = logLine .. (self.isMopping and " (mopping)" or " (cleaning)")

  self:haGet("states/" .. CLEANING_PROGRESS_ENTITY, function(data)
    if data and data.state then
      local progress = tonumber(data.state)
      if progress then
        logLine = logLine .. " - " .. tostring(progress) .. "% done"
      end
    end
    self:updateProperty("log", logLine)
  end)
end

-------------------------------------------------------------------
-- Maintenance / "requires cleaning" (consumables) check
-------------------------------------------------------------------

function QuickApp:checkMaintenance()
  local entities = {}
  for name, id in pairs(CONSUMABLE_ENTITIES) do
    table.insert(entities, { name = name, id = id })
  end

  if #entities == 0 then
    self.info.attention = "n/a (no consumable sensors configured)"
    self:renderLabel()
    return
  end

  local remaining = #entities
  local needsAttention = false
  local lowItems = {}

  for _, e in ipairs(entities) do
    self:haGet("states/" .. e.id, function(data)
      remaining = remaining - 1
      if data then
        local val = tonumber(data.state)
        if val and val < MAINTENANCE_THRESHOLD then
          needsAttention = true
          table.insert(lowItems, e.name .. " (" .. tostring(val) .. "%)")
        end
      end
      if remaining == 0 then
        local text = needsAttention and "Yes" or "No"
        if needsAttention then
          text = text .. " - " .. table.concat(lowItems, ", ")
        end
        self.info.attention = text
        self:renderLabel()
      end
    end)
  end
end

-------------------------------------------------------------------
-- Button actions
-------------------------------------------------------------------

function QuickApp:startCleaning()
  self:debug("Start pressed")
  self:haCallService("vacuum", "start", VACUUM_ENTITY)
end

function QuickApp:pauseCleaning()
  self:debug("Pause pressed")
  self:haCallService("vacuum", "pause", VACUUM_ENTITY)
end

function QuickApp:returnToDock()
  self:debug("Return to dock pressed")
  self:haCallService("vacuum", "return_to_base", VACUUM_ENTITY)
end

-------------------------------------------------------------------
-- Cleaning mode buttons (vacuum / mop / both)
-- Sets the mode via HA's select entity, then it applies to whatever
-- cleaning run you start next (press Start after picking a mode).
-------------------------------------------------------------------

function QuickApp:setModeSweep()
  self:debug("Set mode: sweeping")
  self:haCallService("select", "select_option", CLEANING_MODE_ENTITY, { option = "sweeping" })
end

function QuickApp:setModeMop()
  self:debug("Set mode: mopping")
  self:haCallService("select", "select_option", CLEANING_MODE_ENTITY, { option = "mopping" })
end

function QuickApp:setModeBoth()
  self:debug("Set mode: sweeping_and_mopping")
  self:haCallService("select", "select_option", CLEANING_MODE_ENTITY, { option = "sweeping_and_mopping" })
end

function QuickApp:setModeMopAfterSweep()
  self:debug("Set mode: mopping_after_sweeping")
  self:haCallService("select", "select_option", CLEANING_MODE_ENTITY, { option = "mopping_after_sweeping" })
end

-------------------------------------------------------------------
-- Suction power buttons
-- Valid options confirmed from HA: quiet, standard, strong, turbo
-------------------------------------------------------------------

function QuickApp:setSuctionQuiet()
  self:debug("Set suction level: quiet")
  self:haCallService("select", "select_option", SUCTION_LEVEL_ENTITY, { option = "quiet" })
end

function QuickApp:setSuctionStandard()
  self:debug("Set suction level: standard")
  self:haCallService("select", "select_option", SUCTION_LEVEL_ENTITY, { option = "standard" })
end

function QuickApp:setSuctionStrong()
  self:debug("Set suction level: strong")
  self:haCallService("select", "select_option", SUCTION_LEVEL_ENTITY, { option = "strong" })
end

function QuickApp:setSuctionTurbo()
  self:debug("Set suction level: turbo")
  self:haCallService("select", "select_option", SUCTION_LEVEL_ENTITY, { option = "turbo" })
end
Lua:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
-------------------------------------------------------------------
-- Mopping intensity / cleaning route buttons
-- Valid options confirmed from HA: quick, standard, intensive, deep
-------------------------------------------------------------------

function QuickApp:setRouteQuick()
  self:debug("Set cleaning route: quick")
  self:haCallService("select", "select_option", CLEANING_ROUTE_ENTITY, { option = "quick" })
end

function QuickApp:setRouteStandard()
  self:debug("Set cleaning route: standard")
  self:haCallService("select", "select_option", CLEANING_ROUTE_ENTITY, { option = "standard" })
end

function QuickApp:setRouteIntensive()
  self:debug("Set cleaning route: intensive")
  self:haCallService("select", "select_option", CLEANING_ROUTE_ENTITY, { option = "intensive" })
end

function QuickApp:setRouteDeep()
  self:debug("Set cleaning route: deep")
  self:haCallService("select", "select_option", CLEANING_ROUTE_ENTITY, { option = "deep" })
end

-------------------------------------------------------------------
-- OPTIONAL: dropdown ("Select") alternative
-- Instead of 4 buttons per category, you can add ONE "Select"-type
-- UI element per category (Choose type -> Select, if your firmware
-- offers it) with the option list below, wired to the matching
-- callback. This replaces setModeSweep/setModeMop/etc.,
-- setSuctionQuiet/etc., and setRouteQuick/etc. with 3 dropdowns
-- total instead of 12 buttons.
--
-- NOTE: the exact way HC3 passes the chosen value to the callback
-- can vary slightly by firmware. If self.debug below doesn't show
-- the value you expect, add this at the top of the function:
--   self:debug(json.encode(event))
-- to see the real event structure, then adjust event.values[1]
-- below to match (e.g. it might be event.value instead).
-------------------------------------------------------------------

function QuickApp:onCleaningModeSelected(event)
  local option = event.values and event.values[1] or event.value
  self:debug("Dropdown - cleaning mode selected: " .. tostring(option))
  self:haCallService("select", "select_option", CLEANING_MODE_ENTITY, { option = option })
end

function QuickApp:onSuctionLevelSelected(event)
  local option = event.values and event.values[1] or event.value
  self:debug("Dropdown - suction level selected: " .. tostring(option))
  self:haCallService("select", "select_option", SUCTION_LEVEL_ENTITY, { option = option })
end

function QuickApp:onCleaningRouteSelected(event)
  local option = event.values and event.values[1] or event.value
  self:debug("Dropdown - cleaning route selected: " .. tostring(option))
  self:haCallService("select", "select_option", CLEANING_ROUTE_ENTITY, { option = option })
end

function QuickApp:onSelectedMapSelected(event)
  local option = event.values and event.values[1] or event.value
  self:debug("Dropdown - map/floor selected: " .. tostring(option))
  self:haCallService("select", "select_option", SELECTED_MAP_ENTITY, { option = option })
end

-------------------------------------------------------------------
-- Mop washing / self-clean time (number entity, range ~10-50 min)
-- Use EITHER a Slider UI element wired to onSelfCleanTimeChanged,
-- OR the 3 preset buttons below - whichever fits your UI better.
-------------------------------------------------------------------

function QuickApp:onSelfCleanTimeChanged(event)
  local raw = event.value or (event.values and event.values[1])
  raw = tonumber(raw)
  if not raw then
    self:error("Could not read a numeric value from the slider event")
    return
  end
  local minutes = sliderToMinutes(raw)
  self:debug("Set mop wash time (slider " .. tostring(raw) .. " -> " .. minutes .. " min)")
  self:haCallService("number", "set_value", SELF_CLEAN_TIME_ENTITY, { value = minutes })
end

function QuickApp:setWashTimeShort()
  self:debug("Set mop wash time: 10 min")
  self:haCallService("number", "set_value", SELF_CLEAN_TIME_ENTITY, { value = 10 })
end

function QuickApp:setWashTimeStandard()
  self:debug("Set mop wash time: 25 min")
  self:haCallService("number", "set_value", SELF_CLEAN_TIME_ENTITY, { value = 25 })
end

function QuickApp:setWashTimeLong()
  self:debug("Set mop wash time: 50 min")
  self:haCallService("number", "set_value", SELF_CLEAN_TIME_ENTITY, { value = 50 })
end

-------------------------------------------------------------------
-- Room cleaning: buttons and/or a dropdown
-- Calls the Dreame integration's custom service to clean specific
-- room(s) only. Resolves the room name against whichever floor/map
-- is CURRENTLY ACTIVE (self.info.map, kept in sync automatically by
-- syncSelectDropdowns) - so make sure the robot is on the right
-- floor/map before triggering a room clean.
-------------------------------------------------------------------

function QuickApp:cleanRoom(roomName)
  local currentMap = self.info.map
  local mapRooms = ROOMS_BY_MAP[currentMap]
  if not mapRooms then
    self:error("No rooms configured for current map '" .. tostring(currentMap) .. "' - check ROOMS_BY_MAP, or wait for the map label to sync")
    return
  end
  local segmentId = mapRooms[roomName]
  if not segmentId then
    self:error("Unknown room '" .. tostring(roomName) .. "' for map '" .. tostring(currentMap) .. "' - check ROOMS_BY_MAP")
    return
  end
  self:debug("Cleaning room: " .. roomName .. " on map " .. currentMap .. " (segment " .. tostring(segmentId) .. ")")
  self:haCallService("dreame_vacuum", "vacuum_clean_segment", VACUUM_ENTITY, { segments = { segmentId } })
end

-- OPTIONAL: individual buttons for a few frequently-used rooms.
function QuickApp:cleanOffice()     self:cleanRoom("Office") end
function QuickApp:cleanLivingRoom() self:cleanRoom("Living Room") end
function QuickApp:cleanCorridor()   self:cleanRoom("Corridor") end
function QuickApp:cleanDiningHall() self:cleanRoom("Dining Hall") end
function QuickApp:cleanKitchen()    self:cleanRoom("Kitchen") end

-- Cleans every room on whichever floor/map is currently active, by
-- sending all of that floor's segment ids in one call.
function QuickApp:cleanAllRooms()
  local currentMap = self.info.map
  local mapRooms = ROOMS_BY_MAP[currentMap]
  if not mapRooms then
    self:error("No rooms configured for current map '" .. tostring(currentMap) .. "' - check ROOMS_BY_MAP, or wait for the map label to sync")
    return
  end
  local segments = {}
  for _, id in pairs(mapRooms) do
    table.insert(segments, id)
  end
  self:debug("Cleaning ALL rooms on map " .. currentMap .. " (segments: " .. table.concat(segments, ", ") .. ")")
  self:haCallService("dreame_vacuum", "vacuum_clean_segment", VACUUM_ENTITY, { segments = segments })
end

-- OPTIONAL: a single "Select" dropdown listing every distinct room
-- name across all floors (11 total: Office, Living Room, Corridor,
-- Dining Hall, Kitchen, Vince Slaapkamer, Viènna Slaapkamer,
-- Jace Slaapkamer, Bathroom, Closet, Ouders Slaapkamer), PLUS a 12th
-- option "All rooms" to clean the whole current floor at once. Wire
-- its onToggled to this one function instead of adding a button per
-- room.
function QuickApp:onRoomSelected(event)
  local roomName = event.values and event.values[1] or event.value
  if roomName == "All rooms" then
    self:cleanAllRooms()
    return
  end
  self:cleanRoom(roomName)
end

function QuickApp:debugDump()
  self:haGet("states/" .. VACUUM_ENTITY, function(data)
    if data then
      self:debug("---- RAW ENTITY DUMP ----")
      self:debug(json.encode(data))
      self:debug("-------------------------")
    else
      self:error("Could not fetch entity for debug dump - check HA_IP/HA_Bearer globals and VACUUM_ENTITY")
    end
  end)
end

  • akatar
  • Registratie: September 2002
  • Laatst online: 17:17
@GeeMoney

Netjes, zit wel een beetje werk in.
Een beetje van mijzelf en een beetje AI.
Die fietst duplicate functies er zo in. Ik heb een opzetje gemaakt en lever vervolgens mijn wensen aan en geef aan dat ik dezelfde opbouw wil hebben en variabelen zoveel mogelijk bovenin wil hebben en dat de code die op moet halen. Paar dry-runs en zelf even nalopen en dan krijg je dit.

  • Hippe Lip
  • Registratie: Februari 2011
  • Laatst online: 21-09 18:05

Hippe Lip

Er valt altijd wat te leren

@GeeMoney
Tip voor die hele lange lappen code: zet die tussen [quote] en [/quote].

Dus zo:
[quote]
[code]
Hier jouw lap code
[/code]
[/quote]

Dan hoeft iemand die niet al die regels code wil lezen niet eindeloos te scrollen om bij het volgende bericht te komen. En dan staat nog steeds alles erin.

Verdraagzaamheid is het hoogste gebod
en wie dat niet eert die schoppen we rot.
<John O`Mill>

Pagina: 1 2 3 Laatste