Domoticz data opslaan in Google Sheets

Gepubliceerd door Robot One op

Spreadsheet

Exporteer gegevens van je smarthome naar een spreadsheet in de cloud

Domoticz houdt de data van je apparaten bij in een eigen database. Maar soms is het nodig die gegevens op te slaan in een andere database, om ze gemakkelijker te gebruiken te maken in bijvoorbeeld een grafisch dashboard. Daar gaat dit artikel over.

Voor het opslaan van IoT data zijn diverse oplossingen, zoals de installatie van de zogenaamde Tijdreeksdatabase InfluxDB die hiervoor is bedoeld, in combinatie met een grafisch pakket zoals Grafana. Beide pakketten lopen onder Debian en ook op de Raspberry Pi. Het zou een elegante oplossing zijn, maar bij pogingen die ik ondernam om InfluxDB, Grafana, Domoticz, Node Red én een VPN tegelijk te laten lopen op een enkele RPi4B liep ik herhaaldelijk tegen problemen aan, bijvoorbeeld met half of niet werkende web-interfaces. Al deze pakketten leggen een flink beslag op de hardware, hebben hun eigen servers en ik vermoed dat ze elkaar uiteindelijk in de weg zaten.

Daarom koos ik voor een recent project een meer eenvoudige oplossing. Het gaat om het opslaan van data van de iSpindel in een (hobby)brouwproces. De iSpindel is een elektronische hydrometer: een apparaatje dat het soortelijk gewicht van een vloeistof tijdens fermentatieprocessen monitort en via WiFi verstuurt, bijvoorbeeld bij het maken van wijn of het bierbrouwen. In mijn vorige blogpost beschreef ik hoe je die data kunt uitlezen in Domoticz. Ik wilde ze echter ook opslaan om niet alleen van de Domoticz grafieken afhankelijk te zijn. En ik vond de oplossing in de kosteloze dienst Google Sheets.

Domoticz data vertalen naar HTTP-Requests

Google Sheets is Excel-achtige app, maar dan een die werkt via de cloud. De gegevens worden bewaard op je Google Drive. En door gebruik te maken van Google Forms, kun je gegevens geautomatiseerd in een sheet plaatsen, door middel van zogeheten HTTP-requests. Het komt erop neer dat je Google Forms via het webprotocol HTTP data toestuurt. De Domoticz-scripttaal dzvents heeft daar standaard commando’s voor. Hoe zorgen we voor de juiste syntax van zo’n commando?

STAP 1:
Ik ga ervan uit dat je al een gratis Gmail abonnement hebt dat je hiervoor kunt gebruiken, maar het is ook mogelijk om hier een nieuwe inlognaam voor te verzinnen en daarmee in te loggen. Ga vervolgens naar Google Forms.

STAP 2:
Noem het formulier bijvoorbeeld ispindel_data. Maak hierin 6 formuliervelden aan met als type ‘Korte antwoordtekst’, want Google Forms kent geen numerieke variabelen. Geef ze de namen: Omgevingstemperatuur, Temperatuur, Tilt, Plato, Batterij en Signaal. Laat de schakelaar ‘Verplicht’ uit staan.

STAP 3:
Klik als je het formulier hebt gemaakt rechtsboven op Verzenden en je krijgt het onderstaande veld te zien, waarin je het link tekentje moet selecteren. Klik dan op Kopiëren:

STAP 3:
Klik als je het formulier hebt gemaakt rechtsboven op Verzenden en je krijgt het onderstaande veld te zien, waarin je het link tekentje moet selecteren. Klik dan op Kopiëren:

STAP 3:
Klik op het menu rechtsboven (de drie bolletjes) en selecteer Vooraf ingevulde link ophalen.

STAP 4:
In een nieuwe browsertab opent nu het invulformulier. Klik in dit venster op de rechter muistoets en kies Paginabron weergeven. Nu opent nog een nieuwe browsertab met een enorm lange html-regel.

STAP 5:
Klik op ctrl-F en zoek naar de naam van het eerste formulierveld. In dit geval Omgevingstemperatuur. Je gaat nu naar het deel van de html-code waarin parameters staan voor het gezochte veld, bijvoorbeeld:
aria-label="Omgevingstemperatuur" aria-describedby="i.desc.1151347394 i.err.1151347394" name="entry.639574119" value=""… etc. De parameter name="entry.639574119" is wat we nodig hebben. Kopieer en plak dit in je favoriete teksteditor.

STAP 6:
Herhaal stap 5 voor alle formuliervelden.

STAP 7:
Ga terug naar de vorige tab met de URL die eindigt op /prefill. Omdat je bij het maken van het formulier in stap 2 geen van de velden verplicht hebt gemaakt, hoef je hier niks in te vullen. Klik onderaan de pagina op de knop Link ophalen en vervolgens in de pop-up onderaan op Link kopiëren:

STAP 8:
Kopieer de link in je favoriete teksteditor. Hiet er ongeveer als volgt uit (maar dan met je eigen formuliercode):
https://docs.google.com/forms/d/e/6LbYe73FbYFpuYpRnrI1uftkgg1FAIpQLJ8jcO2ZseiScyXnOgZuqivM/viewform?usp=pp_url

STAP 9:
Bewaar alleen de cijfer-lettercode (in het voorbeeld 6LbYe73FbYFpuYpRnrI1uftkgg1FAIpQLJ8jcO2ZseiScyXnOgZuqivM), de rest van de regel kun je wissen.

STAP 10:
Ga naar Domoticz in je browser en maakt een dzvents-script aan via Instellingen > Meer opties > Gebeurtenissen > +.

STAP 11:
Kopieer het onderstaande dzvents script en plak het in Domoticz.

-- Sla iSpindel data op in Google spreadsheet (via Google Forms)
-- dzVents script

data return {
    on = {
        devices = {
            'ispindel_Tilt',
        },
    },

    execute = function(domoticz, device)
        
        urlstart = "https://docs.google.com/forms/d/e/6LbYe73FbYFpuYpRnrI1uftkgg1FAIpQLJ8jcO2ZseiScyXnOgZuqivM/formResponse?"
        Omgevingstemperatuur = '&entry.957634191=' .. domoticz.devices('Omgevingstemperatuur').rawData[1]
        Temperatuur = '&entry.1426070478=' .. domoticz.devices('ispindel_Temperatuur').rawData[1]
        Tilt = '&entry.2009669143=' .. domoticz.devices('ispindel_Tilt').rawData[1]
        Plato = '&entry.671292995=' .. domoticz.devices('ispindel_Gravity').rawData[1]
        Batterij = '&entry.633183568=' .. domoticz.devices('ispindel_Batterij').rawData[1]
        Signaal = '&entry.1387325523=' .. domoticz.devices('ispindel_Signaal').rawData[1]
        
        url = urlstart .. Omgevingstemperatuur .. Temperatuur .. Tilt .. Plato .. Batterij .. Signaal
        domoticz.openURL(url) 
        
    end
}

STAP 12:
Vervang in scriptregel 13 (urlstart=) de cijfer-lettercode door je eigen code die je in stap 9 hebt bewaard.

STAP 13:
Vervang in de scriptregels 14 t/m 19 de entry-getallen in de gedeeltes &entry.341957691= door de entry-getallen die je in stappen 5 en 6 hebt opgehaald. Controleer of er geen spel- of tikfouten in de codes of in namen van de apparaten zitten.

STAP 14:
Sla het script op. Klaar! Iedere keer als de iSpindel data naar Domoticz stuurt, wordt deze nu ook in de spreadsheet opgeslagen. Je kunt de opgeslagen data van je iSpindel bekijken in Google Sheets in het spreadsheet ispindel data (Antwoorden) en daarin ook bijvoorbeeld grafieken aanmaken om het verloop van de gisting aanschouwelijk te maken.

Zoals gezegd maak ik in onderstaand voorbeeld gebruik van data van de iSpindel. Deze methode is uiteraard ook bruikbaar om andere Domoticz-processen te monitoren.

Zie ook:

Foto: Mika Baumeister/Unsplash


4 reacties

André · 2 januari 2022 op 22:22

Met verbazing dit artikel gelezen alleen denk ik dat ik er maar weinig van snap 😉
Is het ook mogelijk om bijvoorbeeld een termometer op deze manier uit te lezen en de waardes door te geven aan Google formulieren
Ik heb een poging gedaan om je stappen uit te voeren maar krijg het niet aan het werk
Ik heb bv een thermometer, genaamd ‘huiskamer’. Vraag me af waar ik deze naam dan in moet vullen in het Eventz gedeelte

    Robot One · 18 januari 2022 op 13:10

    Jazeker, dat kan. Er van uitgaande dat de rest van het script hetzelfde blijft:
    Omgevingstemperatuur = '&entry.957634191=' .. domoticz.devices('huiskamer').rawData[1]
    …waarbij je natuurlijk de juiste &entry code van je formulier invult.
    Lukt het dan nog niet, zet er dan nog eens een regel print(domoticz.devices('huiskamer').rawData[1]) bij om het logbestand te kunnen checken of je thermometerwaarde wel op de juiste plek staat.

André · 24 januari 2022 op 18:30

Bedankt voor je reactie!. Inmiddels is het gelukt

Stefan · 7 oktober 2022 op 15:39

Bij mij heeft Domoticz moeite met de combinatie ‘data return’ daar geeft hij een foutmelding op.

Hij geeft op regel 7 de volgende melding: [7:0] unexpected identifier ‘data’ near ‘{‘

Wat betekend dit?
Wanneer ik ‘data’ weg haal is de foutmelding weg en stopt de foutenlog ook. Er wordt dan geen data gecollecteerd in mijn google sheet. (met foutmelding overigens ook niet)

Geef een reactie

Avatar plaatshouder

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *