Sinds enige tijd ben ik aan de slag met programmeren in Python. Hierbij wil ik onder andere gebruik maken van de Telegram API, waarvoor gebruik gemaakt wordt van de requests module van Python.
Wat echter opvalt is dat het laden van deze module (import requests) erg lang duurt.
requests 2.20.1
request-oauthlib 1.0.0
pyOpenSSL 18.0.0
cryptography 2.4.1
cffi 1.11.5
chardet 3.0.4
urllib3 1.24.1
Ik heb al een analyse gedaan door gebruikt te maken van profimp. Deze laat zien dat de tijd met name 'verloren' gaat in:
De Domoticz status zou ik eventueel nog als parameter kunnen meegeven aan de aanroep, en door middel van 'lazy' loading de 'import requests' pas uitvoeren vlak voordat de Telegram-api wordt aangesproken, echter maakt dit het geheel naar mijn idee niet doorzichtiger en geniet daardoor niet de voorkeur.
Andere optie zou een het maken van een achtergrondservice zijn. Ik heb al een achtergrondservice ontwikkeld en draaien m.b.t. aanwezigheidsdetectie met behulp van Unifi en Bluetooth. Hier wordt ook gebruik gemaakt van de requests-module, maar deze wordt slechts één keer geladen waardoor deze timeout niet relevant is. Ik vermoed echter dat ook deze niet voldoende snelheid (single loop) 'haalt' om alle events vanuit Domoticz te ontvangen. Deze zou dan immers in een loop de Domoticz-status van de sensoren moeten 'pollen'. Een deur kan dusdanig snel open en dicht dat deze mutatie wellicht over het hoofd gezien wordt. Overal zijn uiteraard oplossingen voor, maar de code moet ook leesbaar blijven, zonder veel workarounds.
Iemand suggesties?
Wat echter opvalt is dat het laden van deze module (import requests) erg lang duurt.
Python:
Het geheel draait op een Raspberry Pi 3B+ met o.a.:1
2
3
4
5
| $ time python3 -c 'import requests' real 0m3,638s user 0m3,638s sys 0m3,638s |
requests 2.20.1
request-oauthlib 1.0.0
pyOpenSSL 18.0.0
cryptography 2.4.1
cffi 1.11.5
chardet 3.0.4
urllib3 1.24.1
Ik heb al een analyse gedaan door gebruikt te maken van profimp. Deze laat zien dat de tijd met name 'verloren' gaat in:
code:
Concreet wil ik graag een alarmsysteem opzetten met behulp van Domoticz. Om de code overzichtelijk en uniform te houden wil ik de afhandeling van sensoren (magneetcontacten / bewegingsmelders) niet afhandelen in Domoticz maar in een stukje Python code. Met name omdat ik voor dezelfde sensoren in diverse scenario's (arm home / arm away) andere inlooptijden / acties wil koppelen). Via dzVents in Domoticz wordt een generiek script aangroepen met de naam van de sensor die geactiveerd is. Binnen dit Python script moet de security-status van Domoticz opgevraagd worden (via de requests-module), en eventueel ook een Telegram-bericht verstuurd worden (ook weer via de requests-module). 1
2
3
| import urllib3 1032ms from urllib3.contrib import pyopenssl 998ms from import utils 392ms |
De Domoticz status zou ik eventueel nog als parameter kunnen meegeven aan de aanroep, en door middel van 'lazy' loading de 'import requests' pas uitvoeren vlak voordat de Telegram-api wordt aangesproken, echter maakt dit het geheel naar mijn idee niet doorzichtiger en geniet daardoor niet de voorkeur.
Andere optie zou een het maken van een achtergrondservice zijn. Ik heb al een achtergrondservice ontwikkeld en draaien m.b.t. aanwezigheidsdetectie met behulp van Unifi en Bluetooth. Hier wordt ook gebruik gemaakt van de requests-module, maar deze wordt slechts één keer geladen waardoor deze timeout niet relevant is. Ik vermoed echter dat ook deze niet voldoende snelheid (single loop) 'haalt' om alle events vanuit Domoticz te ontvangen. Deze zou dan immers in een loop de Domoticz-status van de sensoren moeten 'pollen'. Een deur kan dusdanig snel open en dicht dat deze mutatie wellicht over het hoofd gezien wordt. Overal zijn uiteraard oplossingen voor, maar de code moet ook leesbaar blijven, zonder veel workarounds.
Iemand suggesties?