Elektrisch zonnescherm ge-automatiseerd met een Shelly 2.5 en verbinden met Domoticz

Monteren

Dit is de originele schakelaar van mijn zonnescherm:

De bovenste 3 contacten vormen de schakelaar met de common in het midden. Naar links is het zonnescherm intrekken, en naar rechts is uitrollen.
De onderste 2 contacten doen niks en zijn alleen bedoeld om ergens je overige draden op te monteren, handig!

Alles aangesloten volgens deze schema's. Ze zijn hetzelfde alleen is rechts wat mij betreft beter weergegeven:

 

Oren dicht en stroom er op!

De Shelly zal zich voor de eerste keer gedragen als een Wifi access point. De naam zal met "Shelly" beginnen en het IP adres voor de web interface is 192.168.33.1
Verbind je Wifi van bijvoorbeeld een tablet of smartphone met de Shelly en ga daarna in je browser naar http://192.168.33.1
Nu kan het apparaat via het menu in de web interface omgezet worden naar een Wifi client en verbonden worden aan het thuis netwerk.
Liefst met een vast IP adres, hetzij door een DHCP server verstrekt.

Met de web interface kan de Shelly insteld worden als "Roller", een rolluik, maar de werking komt overeen met een zonnescherm.

In de web interface zit een optie om de Shelly te calibreren voor het zonnescherm.
Dit moet doorlopen worden om later vanuit Domoticz het zonnescherm bijvoorbeeld 75% uit te rollen, in plaats van alleen maar 100% uit of in.

Het zonnescherm gaat tijdens calibratie vanzelf een paar keer helemaal in en uit.
De Shelly weet zelf wanneer de eindpunten bereikt zijn omdat de gevraagde stroom gemeten wordt en zal stil vallen als het eindpunt van het zonnescherm is bereikt.
Met de handschakelaar stopt het zonnescherm uiteindelijk ook vanzelf, da's dus meetbaar.

Aan het einde van de calibratie zal het zonnescherm op bepaalde punten even stoppen om op 50% af te sluiten.
De calibratie is nu voltooid.

De handschakelaar zou nu ook nog moeten werken, alleen is een tikje genoeg om uit te rollen. Stoppen op de juiste positie is nog een tikje naar dezelfde stand.
Persoonlijk vindt ik dit niet handig en heb het via de web interface omgezet naar schakelaar vast houden en stoppen bij loslaten. Zo was het ook altijd.

Iets om op te letten: Je kan zelf een maximale tijd van uitrollen en intrekken opgeven.
Dit kan later of geef een waarde in waarbij de calibratie genoeg speling heeft om niet in de timeout te lopen.


Koppelen met Domoticz

Aan Domoticz moet een hardware device worden toegevoegd van het type "Dummy".

Ga nu naar menu "Schakelaars" en klik op "Handmatig". Kies het zonnescherm en geef het een naam. Het Type, House Code en Unit Code zijn niet van belang.

Zo ziet het apparaat er uit:

Menu "schakelaars" (de schuif is wellicht pas zichtbaar na Aanpassen):

En onder "Aanpassen":

De HTTP interface van de Shelly ondersteund de volgende opties die bruikbaar zijn:

GET http://[ipadres]/roller/0?go=open
GET http://[ipadres]/roller/0?go=close
GET http://[ipadres]/roller/0?go=to_pos&roller_pos=85
GET http://[ipadres]/roller/0

Bij de "Aan" actie URL kun je de bovenste link invullen en bij de "Uit" actie de 2e link. Dat zal werken maar niet om bijvoorbeeld het scherm 75% uit te rollen. Daar is een LUA script voor nodig.

Via de onderste link is de status als JSON op te vragen zonder bewegingen van het zonnescherm. De rest van de aanroepen spreken voor zich denk ik. Overigens komt van alle aanroepen dezelfde JSON structuur retour:

{
  "state": "stop",
  "power": 0,
  "is_valid": true,
  "safety_switch": false,
  "overtemperature": false,
  "stop_reason": "normal",
  "last_direction": "close",
  "current_pos": 0,
  "calibrating": false,
  "positioning": true
}
Ter info: "calibrating" is FALSE, maar toch is de calibratie voltooid, en procentueel positioneren werkt ook, vreemd. Misschien omdat "positioning" TRUE is?

Om in Domoticz gebruik te kunnen maken van de Shelly HTTP interface en het procentueel positioneren van het scherm is een dzVents LUA script nodig. Ik heb deze gemaakt en het werkt:

return
{
        on = {
                devices = { 'Zonnescherm' }
        },

        execute = function(domoticz, item)

                -- LUA script by Andreotti - 16 aug 2020, updated 7 may 2022
                local BaseURL = 'http://zonnescherm.andreotti.nl'
                local myLevel = domoticz.devices('Zonnescherm').level -- 0..15
                local myState = domoticz.devices('Zonnescherm').state -- Open (is ingetrokken), Close (is volledig uitgerold)

                if (myLevel > 0 and myLevel < 15) then
                        perc = math.floor((100 * myLevel) / 15)
                        domoticz.openURL({
                                url = BaseURL .. '/roller/0?go=to_pos&roller_pos=' .. perc,
                                method = 'GET'
                        })
                        --domoticz.notify(perc)
                elseif (myState == 'Open') then
                        domoticz.openURL({
                                url = BaseURL .. '/roller/0?go=close',
                                method = 'GET'
                        })
                        --domoticz.notify('In')
                elseif (myState == 'Closed') then
                        domoticz.openURL({
                                url = BaseURL .. '/roller/0?go=open',
                                method = 'GET'
                        })
                        --domoticz.notify('Uit')
                end
        end
}

Het script moet in de map "/domoticz/scripts/dzVents/scripts" geplaatst worden en de extentie moet op "LUA" eindigen, bijvoorbeeld: zonnescherm.lua

Uiteraard moet je [ipadres] vervangen voor het echte IP adres van de Shelly, ik zeg het er maar bij...

De verwerking van de status (open/close) heeft voorrang op het verwerken van het percentage. Dat is zo gemaakt omdat het percentage tijdens mijn testen onbetrouwbaar was. Als de schuif naar rechts bewogen werd, dan liep het percentage netjes op. Het ging alleen niet naar 100, maar sprong op het allerlaatst naar 15 als hoogste punt. Misschien is het een bug, geen idee.

Nadeel van dit script is dat als het zonnescherm op een andere manier wordt bedient dan via Domoticz, de schuif niet bijgewerkt wordt.


Ik heb er ook 1 gemaakt waarbij Domoticz wel bijgewerkt wordt. Op eigen risico!

return
{
	on = {
		timer = { 'every minute' }, -- timer needed to update roller if operated from another control (manual or Shelly I/F)
		devices = { 'Zonnescherm' }, -- device name or IDX#
		httpResponses = { 'zonneschermStatus' }
	},
	
	execute = function(domoticz, item)

		-- LUA script by Andreotti - 16 aug 2020
		local myState = domoticz.devices('Zonnescherm').state -- Open (is ingetrokken), Close (is volledig uitgerold)
		local BaseURL = 'http://[ipadres]'

		if (item.isTimer) then
			domoticz.openURL({
				url = BaseURL .. '/roller/0',
				method = 'GET',
				callback = 'zonneschermStatus'
			})
			-- domoticz.notify('Zonnescherm timer')
		elseif (item.isHTTPResponse) then
			if (item.ok) then -- statusCode == 2xx
				local curPos -- van Domoticz
				local newPos = item.json.current_pos -- van het zonnescherm

				if (myState == 'Open') then
					curPos = 0
				elseif (myState == 'Closed') then
					curPos = 100
				else
					curPos = domoticz.devices('Zonnescherm').level
				end

				if (curPos ~= newPos) then
					domoticz.devices('Zonnescherm').setLevel(newPos)
				end
				-- domoticz.notify('Call back cur pos: ' .. curPos)
				-- domoticz.notify('Call back new pos: ' .. newPos)
				-- domoticz.notify('Call back state: ' .. myState)
			end
		elseif (item.isDevice and item.active) then
			if (myState == 'Open') then
				domoticz.openURL({
					url = BaseURL .. '/roller/0?go=close',
					method = 'GET'
				})
				-- domoticz.notify('In')
			elseif (myState == 'Closed') then
				domoticz.openURL({
					url = BaseURL .. '/roller/0?go=open',
					method = 'GET'
				})
				-- domoticz.notify('Uit')
			else
				-- local newPos = item.level -- this value is unreliable, don't use it like this!
				local newPos = domoticz.devices('Zonnescherm').level
				domoticz.openURL({
					url = BaseURL .. '/roller/0?go=to_pos&roller_pos=' .. newPos,
					method = 'GET'
				})
				-- domoticz.notify(newPos)
			end
		end
	end
}

Het script werkt, alleen is alles getest in een testomgeving en dus niet live! Ik weet dus niet of het in de praktijk ook werkt en wat er gebeurd als het langere tijd achter elkaar draait.
Ik ben geen LUA expert, dit is de 2e keer dat ik er iets mee doe, maar misschien is het een zetje in de juiste richting voor iemand anders.

De versies van Domoticz en Shelly zijn op het moment van schrijven:
Domoticz: 2020.2
Shelly2.5: 20200812-091015/v1.8.0

Domoticz draait samen met Pi-Hole op een Raspberry Pi3+ en alles is up-to-date.

Een volledige SDK handleiding van de Shelly staat hier: Shelly 2.5 SDK
Help Domoticz LUA: Domoticz dzVent LUA

Als er vragen zijn, google is je beste vriend. Voor mij is het een afgerond project en alles wat ik weet staat hier.