Container scripts gebruiken voor LUA-scripts in Domoticz
Domoticz is verslavend als je er eenmaal aan begonnen bent. Ooit ben je begonnen met één simpel LUA script, maar hoeveel heb je er nu inmiddels? Ik heb er zo’n 65 scripts draaien. Op zich geen probleem, de Raspberry Pi 3 is er snel genoeg voor, maar toch merkte ik dat bijvoorbeeld het schakelen van lampen langzamer ging. Niet veel, maar wel nét hinderlijk. Tijd om een oplossing te zoeken! Na enig speurwerk bedacht ik me ineens dat time-based scripts iedere minuut lopen, terwijl sommige scripts maar één keer per dag iets hoeven te doen. 1439 van de 1440 keer op een dag hoefde die scripts dus niets te doen. Een efficiëntie van 0,07% ! Bij device-based script is die efficiëntie nog veel lager! Ik besloot om twee container scripts aan te maken, één voor de tijd en één voor de devices.
Benodigdheden
De eerste stap is om een nieuwe map aan te maken onder /home/pi/domoticz/. Ik heb deze map scriptsjoost genoemd. Vervolgens heb ik in de map scriptsjoost submappen aangemaakt, waardoor ik direct kan zien waar ik een bepaald soort scripts (bash, lua, python, etc.) kan vinden. Op zich zijn deze submappen niet noodzakelijk (maar wel handig). Vervolgens heb ik alle zelf aangemaakte scripts die in /home/pi/domoticz/scripts/lua/ stonden verplaatst naar /home/pi/domoticz/scriptsjoost/lua/. De map /home/pi/domoticz/scripts/lua/ bevat nu alleen nog het bestand JSON.lua.
Bij alle LUA-scripts in de map /home/pi/domoticz/scriptsjoost/lua moet je de regels met commandArray = {}
en return commandArray
verwijderen.
In de map /home/pi/domoticz/scripts/lua/ maak je nu twee bestanden aan: script_time_container.lua en script_device_container.lua. Iedere minuut (of bij een wijziging van een device) zullen nu nog maar twee scripts draaien. In deze twee scripts geven we aan welke scripts er nog meer gedraaid moeten gaan worden. Onderstaand nog een voorbeeldje hoe de mappenstructuur moet zijn:
Container script_time_container.lua
In het script_time_container.lua geef je aan op welke tijden de time-based scripts moeten draaien.
Hieronder vind je een voorbeeld van het script_time_container.lua bestand, wat je naar eigen wens kunt aanpassen. Je ziet bijvoorbeeld dat het script energiekosten_jaar.lua na alleen nog maar om 23.59 uur zal draaien in plaats van iedere minuut (1440 keer per dag!).
if (time.min % 1)==0 zorgt ervoor dat het script iedere minuut (bv. 11.00 uur , 11.01 uur, 11.02 uur, 11.03 uur, etc.) uitgevoerd wordt.
if (time.min % 5)==0 zorgt ervoor dat het script iedere 5 minuten (bv. 11.00 uur, 11.05 uur, 11.10 uur, 11.15 uur, etc.) uitgevoerd wordt.
if ((time.min+2)%5)==0 zorgt ervoor dat het script iedere 5 minuten (bv. 11.03 uur, 11.08 uur, 11.13 uur, 11.18 uur, etc.) uitgevoerd wordt.
if time.hour == 6 and time.min == 45 zorgt ervoor dat het script alleen om 6.45 uur uitgevoerd wordt.
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 |
-- Get System Time/Date time = os.date("*t") weekday = os.date("%A") minutes = time.min + time.hour * 60 -- Set Lua Path lua_path = "/home/pi/domoticz/scriptsjoost/lua/" commandArray = {} if (time.min % 1)==0 then dofile(lua_path.."humidity.lua") end if (time.min % 5)==0 then dofile(lua_path.."gemiddelde_temperatuur_binnen.lua") dofile(lua_path.."gemiddelde_temperatuur_buiten.lua") dofile(lua_path.."reistijd_waze.lua") end if (time.min % 15)==0 then dofile(lua_path.."buienradar.lua") end if ((time.min+2)%5)==0 then dofile(lua_path.."weer.lua") end if ((time.min+1)%10)==0 then dofile(lua_path.."reistijd.lua") end if time.hour == 6 and time.min == 45 then dofile(lua_path.."verlichting_keukenleds.lua") end if time.hour == 7 and time.min == 00 then dofile(lua_path.."alarm_uit_dag_nacht.lua") end if time.hour == 7 and time.min == 30 then dofile(lua_path.."variabelen_resetten.lua") end if time.hour == 7 and time.min == 49 then dofile(lua_path.."rolgordijn_open_dicht.lua") end if time.hour == 8 and time.min == 00 then dofile(lua_path.."verlichting_keukenleds.lua") end if time.hour == 8 and time.min == 30 then dofile(lua_path.."verlichting_keukenleds.lua") end if time.hour == 9 and time.min == 30 then dofile(lua_path.."rolgordijn_open_dicht.lua") end if time.hour == 10 and time.min == 00 then dofile(lua_path.."variabelen_resetten.lua") dofile(lua_path.."stofzuigen.lua") end if time.hour == 17 and time.min == 30 then dofile(lua_path.."verlichting_keukenleds.lua") end if time.hour == 20 and time.min == 00 then dofile(lua_path.."batterij_check.lua") end if time.hour == 23 and time.min == 00 then dofile(lua_path.."alarm_aan_dag_nacht.lua") end if time.hour == 23 and time.min == 59 then dofile(lua_path.."energiekosten_jaar.lua") end return commandArray |
Container script_device_container.lua
In het script_device_container.lua script geeft je aan welke script moet draaien als één bepaald device gewijzigd is. Het script verlichting_hal.lua zal dus alleen nog maar draaien indien device DWS_Voordeur of Sirene Woonkamer gewijzigd is.
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 |
-- Get System Time/Date time = os.date("*t") weekday = os.date("%A") minutes = time.min + time.hour * 60 -- Set Lua Path lua_path = "/home/pi/domoticz/scriptsjoost/lua/" commandArray = {} if devicechanged['DWS_Voordeur'] then dofile(lua_path.."verlichting_hal.lua") dofile(lua_path.."alarm_trigger.lua") end if devicechanged['DWS_Meterkast'] then dofile(lua_path.."alarm_trigger.lua") end if devicechanged['DWS_Achterdeur'] then dofile(lua_path.."alarm_trigger.lua") end if devicechanged['DWS_Slaapkamerraam'] then dofile(lua_path.."alarm_trigger.lua") end if devicechanged['DWS_Washok'] then dofile(lua_path.."alarm_trigger.lua") end if devicechanged['DWS_Schuurdeur'] then dofile(lua_path.."alarm_trigger.lua") end if devicechanged['Sirene Woonkamer'] then dofile(lua_path.."verlichting_hal.lua")end if devicechanged['Donker buiten'] then dofile(lua_path.."verlichting_voordeur.lua") end if devicechanged['FAN1'] then dofile(lua_path.."ventilatie.lua") end if devicechanged['FAN2'] then dofile(lua_path.."ventilatie.lua") end if devicechanged['FAN3'] then dofile(lua_path.."ventilatie.lua") end if devicechanged['Xiaomi Mi 8'] then dofile(lua_path.."iemand_thuis.lua") end if devicechanged['Geofencing_Thuis'] then dofile(lua_path.."iemand_thuis.lua") end if devicechanged['Iemand thuis'] then dofile(lua_path.."pc_aan_uit.lua") dofile(lua_path.."tv_aan_uit.lua") dofile(lua_path.."alarm_aan_uit_thuis_weg.lua") dofile(lua_path.."stofzuigen.lua") end if devicechanged['TV Slaapkamer'] then dofile(lua_path.."tv_aan_uit.lua") end if devicechanged['Alarm situatie'] then dofile(lua_path.."alarm_situatie.lua") end if devicechanged['Deurbel'] then dofile(lua_path.."deurbel.lua") end if devicechanged['Donker buiten'] then dofile(lua_path.."rolgordijn_open_dicht.lua") end if devicechanged['Temperatuur Binnen'] then dofile(lua_path.."gecombineerde_sensoren.lua") end if devicechanged['Svetlana - Status'] then dofile(lua_path.."stofzuigen.lua") end return commandArray |
Indien je alle scripts in de interne Domoticz editor hebt staan, dan zal bovenstaande niet werken. Je zal dan eerst alle scripts in de map /home/pi/domoticz/scriptsjoost/lua/ moeten zetten en verwijderen (of uitschakelen) in de Domoticz editor.
Let erop dat de namen van de LUA-bestand in bovenstaande scripts exact overeenkomen met de namen van de werkelijke bestand. Een onterechte hoofdletter zorgt er bijvoorbeeld voor dat het script niet zal draaien!
Als je bovenstaande stappen hebt uitgevoerd zal je zeker merken dat alle schakelingen een stuk vlotter gaan! Vragen? Stel ze hieronder…
Mooi gemaakt hoor en het is wel een dingetje.
Alleen waarom kan dit niet in de interne editor?
Nu moet je toch telkens een extra backup maken voor deze map/scripts
Terwijl ze in de interne zitten dit met een db backup allemaal in 1 keer geregeld kan zijn.
Er is toch een optie om lua op time af te schieten?
Zou toch in de interen moeten kunnen?
Voor een automatische back-up hebben wij ook een artikel online gezet enige tijd geleden. Hoef je maar 1x op te zetten en het draait iedere dag automatisch.
Ik weet dat er een script is voor backups…
En dat werkt ook wel, net zo als ik met de fiets naar rome kan …
Alleen dan nog moet je eea terug zetten en een crontab installeren enz enz
De interen blijft winnen van externe toch?
Met een image-backup is het slechts één druk op de knop, minder werk dan Raspbian/Domoticz installeren en backup terugzetten.
Hoi Dombo71,
Hoe kun je vanuit het ene interne script het andere interne script aanroepen?
Anne.
Hoi Joost,
Het zijn dus 2 custom cron job scripts.
Is er geen mogelijkheid dat bijvoorbeeld
if time.hour == 6 and time.min == 45
net gemist wordt?
Bijvoorbeeld als het uitvoeren van humidity.lua meer dan een minuut duurt.
Of wordt dit script sowieso aangeroepen ook als is de vorige aanroep nog bezig?
Anne.
Hoi Anne,
Goede vraag! Ik heb mijn logbestanden zojuist bekeken en zie dat de time-based scripts altijd allemaal binnen 6 seconden uitgevoerd wordt (en het zijn een stuk meer scripts als in het voorbeeld staan). Voordat ik de container bestanden in gebruik nam had ik geregeld dat er een script werd overgeslagen. Nu komt dat niet meer voor (tenzij een batterij van een device bijna leeg is).
Hoi Joost,
Zou jij voor mij een script kunnen schrijven tegen betaling?
Niet tegen betaling, daar heb ik geen tijd voor. Wat voor script heb je nodig? Misschien heb ik nog wel iets op de plank liggen…
Ik ben net begonnen met Domoticz en heb een script binnen Domoticz en met dofile() geprobeerd een file aan te roepen, zoals “rolgordijn_open_dicht.lua”:
if devicechanged[‘Donker buiten’] then dofile(lua_path..”rolgordijn_open_dicht.lua”) end
Ik krijg steeds de foutmelding 32256
Zou je bijv: het script v.d. rolgordijnen hier kunnen plaatsen of zijn uw files ergens te downloaden ?
Vind het container idee zeer goed bedacht. het maakt het erg overzichtelijk ipv elle lange scripts.
Waarschijnlijk staan de rechten van het script-bestand niet juist. Zet deze eens op 755…
Als ik bij rechten het octale bedrag in 0755 wijzig dan verandert alleen het
errornummer in 512 ipv 32256 achter return.
2020-01-30 15:26:43.503 Status: Executing script: /home/pi/domoticz/scripts/script_vent_on.lua
2020-01-30 15:26:43.572 Error: Error executing script command (/home/pi/domoticz/scripts/script_vent_on.lua). returned: 32256 (bij rechten oct 0644)
2020-01-30 15:28:32.888 Status: Executing script: /home/pi/domoticz/scripts/script_vent_on.lua
2020-01-30 15:28:32.979 Error: Error executing script command (/home/pi/domoticz/scripts/script_vent_on.lua). returned: 512 (bij rechten oct 0755)
Graag even hier (https://domoticaboard.nl/index.php?board=7.0) een topic opnemen en jouw script plaatsen, dan kan ik (of iemand anders) kijken waar het fout gaat.
Hallo,
Bedankt voor de mooie scripts!
Klopt het dat wanneer je in een time-script meerdere jobs tegelijk wil starten dat er dan maar 1 per keer wordt uitgevoerd?
Voorbeeld:
if (time.min % 5)==0 then dofile(lua_path..”gemiddelde_temperatuur_binnen.lua”)
dofile(lua_path..”gemiddelde_temperatuur_buiten.lua”)
dofile(lua_path..”reistijd_waze.lua”) end
Eerst gemiddelde_temperatuur_binnen.lua. 5 minuten later gemiddelde_temperatuur_buiten.lua
en weer 5 minuten later reistijd_waze.lua
Kunnen die niet tegelijk worden uitgevoerd?
Groet,
Richard
Nee, dat klopt niet. Alle 3 de scripts worden dan iedere 5 minuten uitgevoerd.