Maak van Domoticz een weerstation – Deel 2

In Maak van Domoticz een weerstation – Deel 1 hebben we al 18 sensoren/switches werkend gekregen om van Domoticz een weerstation te maken. Helaas ontbreken we nog enkele gegevens om een weerbericht voor de volgende dag te kunnen maken. In dit artikel leggen we uit hoe we de ontbrekende gegevens kunnen toevoegen. Het gaat om:

  • Grondtemperatuur
  • Verwachting morgen
  • Verwachting uitgebreid
  • Temperatuur dauwpunt
  • Bewolkingsgraad
  • UV-waarde
  • Ozon-waarde

 

 

Benodigdheden

 

Virtuele sensoren aanmaken

De volgende stap is om een virtuele sensor aan te maken. Ga naar Setup -> Hardware en kies bij Type voor Dummy. Je mag zeg een herkenbare naam kiezen:

Zodra de Dummy Hardware toegevoegd is kunnen de virtuele sensoren gaan aanmaken. Klik hiervoor op Create Virtual Sensors (in het donkerblauw).

Maak nu de virtuele sensor aan van het type “Temperature” en geef “Temperatuur Grond” als naam van de sensor in:

Maak op dezelfde wijze onderstaande virtuele sensoren aan (hou dezelfde namen aan, anders moet je ze ook wijzigen in het script op regel 25 t/m 31):

Verwachting morgen      — Text sensor
Verwachting uitgebreid  — Text sensor
Temperatuur Dauwpunt    — Temperature sensor
Bewolkingsgraad         — Percentage sensor
UV                      — UV sensor
Ozone                   — Custom sensor met axis “DU”

 

DarkSky API-key

Tot slot moeten we nog een API-key aanmaken op de website van DarkSky. Deze API-key heb je nodig om via het script informatie van DarkSky naar Domoticz te halen. Volg de instructies op de DarkSky website.

Darksky API

 

Script

De laatste stap is het script. Ga naar Setup > More Options > Events en kies voor een LUA event (van het type Time). Kopieer onderstaand script naar Domoticz. Vul op regel 14 het IP + poortnummer van Domoticz in. Vul op regel 15 het nummer van een weerstation bij jou in de buurt in. Op regel 16 vul het de API-key van DarkSky in. Debugging kun je op regel 17 aan- of uitzetten. Tot slot kun je op regel 18 de taal voor de weersverwachtingen instellen. Activeer het event en sla het op.

--[[ WEERSTATIONS:
Amsterdam   = 36  Groningen           = 13  Oost-Groninigen = 31  Vlissingen      = 44
Arnhem      = 2   Hoek van Holland    = 17  Oost-Overijssel = 12  Voorschoten     = 46
Berkhout    = 3   Hoogeveen           = 18  Rotterdam       = 33  Wadden          = 19
Den Helder  = 6   Leeuwarden          = 26  Utrecht         = 5   Weert           = 8
Eindhoven   = 7   Lelystad            = 27  Terneuzen       = 47  West-Friesland  = 38
Gilze Rijen = 10  Maastricht          = 29  Twente          = 41  West-Utrecht    = 28
Goes        = 11  Noord-Groninigen    = 24  Uden            = 45  Woensdrecht     = 50
Gorinchem   = 16  Noordoostpolder     = 30  Venlo           = 1   Zwolle          = 15
--]]
--------------------------------
---------- SETTINGS ------------
--------------------------------
local domo_ip       = "192.168.2.62:8080"					-- IP adres van Domoticz, inclusief poort
local weerstation   = 33                                    -- Kies je weerstation naar keuze
local api_key       = "126387d6c1a1bd4731a2f366854ab8ed5"    -- Darksky secret key
local debug         = 1                                     -- 0 = no debug, 1 = debug
local language      = "nl"                                  -- ar: Arabic, az: Azerbaijani, be: Belarusian, bg: Bulgarian, bs: Bosnian, ca: Catalan, cs: Czech, da: Danish,
                                                            -- de: German, el: Greek, en: English, es: Spanish, et: Estonian, fi: Finnish, fr: French, he: Hebrew, hr: Croatian,
                                                            -- hu: Hungarian, id: Indonesian, is: Icelandic, it: Italian, ja: Japanese, ka: Georgian, ko: Korean, kw: Cornish,
                                                            -- lv: Latvian, nb: Norwegian Bokmål, nl: Dutch, no: Norwegian Bokmål (alias for nb), pl: Polish, pt: Portuguese,
                                                            -- ro: Romanian, ru: Russian, sk: Slovak, sl: Slovenian, sr: Serbian, sv: Swedish, tet: Tetum, tr: Turkish,
                                                            -- uk: Ukrainian, x-pig-latin: Igpay Atinlay, zh: simplified Chinese, zh-tw: traditional Chinese

local dev_TempGround    = "Temperatuur Grond"       -- Temperature sensor
local dev_TextTomorrow  = "Verwachting morgen"      -- Text sensor
local dev_LongText      = "Verwachting uitgebreid"  -- Text sensor       
local dev_DewPoint      = "Temperatuur Dauwpunt"    -- Temperature sensor 
local dev_CloudCover    = "Bewolkingsgraad"         -- Percentage sensor
local dev_UV            = "UV"                      -- UV sensor
local dev_Ozone         = "Ozone"                   -- Custom sensor with axis "DU"

--Functie devices updaten
function UpdateDev(device,nvalue,svalues)
    commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|'..tostring(nvalue)..'|'..tostring(svalues)}
end
-- Functie afronding
function round(num, dec)
    if num == 0 then
        return 0
    else
        local mult = 10^(dec or 0)
        return math.floor(num * mult + 0.5) / mult
    end
end
--------------------------------------------------
----- ######## Buienradar API Data call ######## -----
--------------------------------------------------
time = os.date("*t")
if  ((time.min+2)%5)==0  then -- Script loopt iedere 5 minuten (bv. 11.03, 11.08, 11.13, 11.18, etc.
    json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
    local config=assert(io.popen('curl "https://api.buienradar.nl/data/public/2.0/jsonfeed"'))
    local Stringjson = config:read('*all')
    config:close()
    local jsonData = json:decode(Stringjson)
-- Convert the json to a LUA table
if jsonData.actual.stationmeasurements[ weerstation ] ~= nil then  -- this sometimes happens around midnight
    val_TempGround              = jsonData.actual.stationmeasurements[ weerstation ].groundtemperature
    val_WeatherTomorrow         = jsonData.forecast.fivedayforecast[1].weatherdescription        
    val_SunChanceTomorrow       = jsonData.forecast.fivedayforecast[1].sunChance
    val_RainChanceTomorrow      = jsonData.forecast.fivedayforecast[1].rainChance        
    val_RainMinimum             = jsonData.forecast.fivedayforecast[1].mmRainMin
    val_RainMaximum             = jsonData.forecast.fivedayforecast[1].mmRainMax
    val_WindDirectionTomorrow   = jsonData.forecast.fivedayforecast[1].windDirection        
    val_WindSpeedTomorrow       = jsonData.forecast.fivedayforecast[1].wind        
    val_TempTomorrowMinMin      = jsonData.forecast.fivedayforecast[1].mintemperatureMin --minimale minimumtemperatuur
    val_TempTomorrowMaxMin      = jsonData.forecast.fivedayforecast[1].mintemperatureMax --maximale minimumtemperatuur
    val_TempTomorrowMinMax      = jsonData.forecast.fivedayforecast[1].maxtemperatureMin --minimale maximumtemperatuur
    val_TempTomorrowMaxMax      = jsonData.forecast.fivedayforecast[1].maxtemperatureMax --maximale maximumtemperatuur
end

--Min/Max. temperatuur bepalen
if val_TempTomorrowMinMin == val_TempTomorrowMaxMin then TempMinimum = val_TempTomorrowMinMin
    else TempMinimum = val_TempTomorrowMinMin.." - "..val_TempTomorrowMaxMin end
if val_TempTomorrowMinMax == val_TempTomorrowMaxMax then TempMaximum = val_TempTomorrowMinMax
    else TempMaximum = val_TempTomorrowMinMax.." - "..val_TempTomorrowMaxMax
end
--Regenhoeveeldheid bepalen
if val_RainMinimum == val_RainMaximum then RainIntensity = val_RainMinimum
    else RainIntensity = val_RainMinimum.." - "..val_RainMaximum end
-- Windrichting tekst bepalen
if val_WindDirectionTomorrow == "z" or val_WindDirectionTomorrow == "Z" then WindDirectionTomorrow = " het zuiden"
    elseif val_WindDirectionTomorrow == "zw" or val_WindDirectionTomorrow == "ZW" then WindDirectionTomorrow = "het zuidwesten"
    elseif val_WindDirectionTomorrow == "zo" or val_WindDirectionTomorrow == "ZO" then WindDirectionTomorrow = "het zuidoosten"
    elseif val_WindDirectionTomorrow == "w" or val_WindDirectionTomorrow == "W" then WindDirectionTomorrow = "het westen"
    elseif val_WindDirectionTomorrow == "nw" or val_WindDirectionTomorrow == "NW" then WindDirectionTomorrow = "het noordwesten"
    elseif val_WindDirectionTomorrow == "n" or val_WindDirectionTomorrow == "N" then WindDirectionTomorrow = "het noorden"
    elseif val_WindDirectionTomorrow == "no" or val_WindDirectionTomorrow == "NO" then WindDirectionTomorrow = " het noordoosten"
    elseif val_WindDirectionTomorrow == "o" or val_WindDirectionTomorrow == "O" then WindDirectionTomorrow = "het oosten"
    else WindDirectionTomorrow = "variabele richtingen" end
--Voorspellingen
forecast=val_WeatherTomorrow.. "\n " .."\n".. "Komende nacht daalt de temperatuur naar "..TempMinimum.." °C. Morgen overdag wordt morgen maximaal "..TempMaximum.. " °C. Er is morgen "..val_SunChanceTomorrow.." % kans op zon en "..val_RainChanceTomorrow.." % kans op neerslag ("..RainIntensity.." mm). De wind komt uit "..WindDirectionTomorrow.." en zal kracht "..val_WindSpeedTomorrow.." Bft hebben." .."\n " .."\n "
if otherdevices_svalues[dev_TextTomorrow] ~= forecast then UpdateDev(dev_TextTomorrow,0,forecast) end
-- Updating domoticz devices
    UpdateDev(dev_TempGround,0,val_TempGround)     
if debug==1 then
    print ("Temperatuur grond: "..val_TempGround.." °C") 
end
end
---------------------------------------
-- ######## Darksy API call ######## --
---------------------------------------
if  ((time.min+2)%5)==0  then -- Script loopt iedere 5 minuten (bv. 11.03, 11.08, 11.13, 11.18, etc.

    json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
    local config=assert(io.popen('curl "http://'..domo_ip..'/json.htm?type=settings"'))
    local Stringjson = config:read('*all')
    config:close()
    local jsonData = json:decode(Stringjson)
-- Convert the json to a LUA table
    lat          = jsonData.Location.Latitude
    lon          = jsonData.Location.Longitude

  local coord = lat..","..lon
 
    json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
    local config=assert(io.popen('curl "https://api.darksky.net/forecast/'..api_key..'/'..coord..'?lang='..language..'&units=si&exclude=hourly,flags"'))
    local Stringjson = config:read('*all')
    config:close()
    local jsonData = json:decode(Stringjson)
-- Convert the json to a LUA table
   if jsonData ~= nil then  -- this sometimes happens around midnight
        val_UV          = jsonData.currently.uvIndex
        val_Ozone       = jsonData.currently.ozone
        val_DewPoint    = round(jsonData.currently.dewPoint,1)
        val_CloudCover  = jsonData.currently.cloudCover*100
end
    
    if debug==1 then
        print("Bewolkingsgraad : "..val_CloudCover.. " %")
        print("UV-kracht :"..val_UV)
        print("Ozone : De ozone-waarde is "..val_Ozone) 
        print("Dauwpunt : "..val_DewPoint.. " °C")
    end
    
-- Domoticz devices updaten
    UpdateDev(dev_CloudCover,0,val_CloudCover)
    UpdateDev(dev_DewPoint,0,val_DewPoint)
    UpdateDev(dev_UV,0,val_UV..";0")
    UpdateDev(dev_Ozone,0,val_Ozone)
 
if debug==1 then
    print ("Dauwpunt: "..val_DewPoint.." °C")
    print ("Bewolkingsgraad: "..val_CloudCover.." %")
    print ("UV-Index: "..val_UV)
    print ("Ozone: "..val_Ozone)
end
end
-------------------------------------------------------
-- ######## Buienradar Verwachting API call ######## --
-------------------------------------------------------
if  ((time.min+2)%30)==0  then -- Script loopt iedere 30 minuten (bv. 11.28, 11.58, 12.28, 12.58, etc.
    json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
    local config=assert(io.popen('curl "https://api.buienradar.nl/data/public/1.1/jsonfeed"'))
    local Stringjson = config:read('*all')
    config:close()
    local jsonData = json:decode(Stringjson)
-- Convert the json to a LUA table
    val_LongText 	= jsonData.buienradarnl.weergegevens.verwachting_vandaag.titel .."\n " .."\n ".. jsonData.buienradarnl.weergegevens.verwachting_vandaag.tekst .."\n " .."\n"

  if debug==1 then
    print ("Uitgebreid: "..val_LongText) 
end
  
if otherdevices_svalues[dev_LongText] ~= val_LongText then UpdateDev(dev_LongText,0,val_LongText) end

end

 

Ga terug naar Deel 1

Ga door naar Deel 3

42 gedachten over “Maak van Domoticz een weerstation – Deel 2

  • 25 november 2018 om 13:01
    Permalink

    Hoi Joost,

    Ik heb je script geprobeerd maar ik loop tegen deze error aan.

    2018-11-25 13:00:00.649 Error: EventSystem: in weer: [string “–[[ WEERSTATIONS:
    …”]:49: attempt to concatenate local ‘lat’ (a nil value)

    Weet jij zo de oplossing?

    Beantwoorden
    • 25 november 2018 om 13:41
      Permalink

      Dat betreft een fout in de user variable LatitudeThuis.

      Heb je als type ‘String’ en bij value een punt i.p.v. een komma gebruikt? Ook de naam van de user variable moet exact overeenkomen.

      Beantwoorden
  • 29 november 2018 om 22:12
    Permalink

    Het kan zijn dat CloudCover in jouw regio (tijdelijk) niet beschikbaar is, dan krijg je een foutmelding in de log te zien. De regel is verder gewoon goed, alleen de fout-afhandeling is nog niet optimaal in het script. Kijk het eens een paar uurtjes aan…

    Beantwoorden
  • 30 november 2018 om 19:58
    Permalink

    Hoi Joost,

    Ik had ook nog een typefout in de sensors :), nu werkt alles behalve de bevolkingsgraad maar die kan ik wel missen.

    Dank voor jouw support!

    Inmiddels het speedtest script van jou ook al draaien.

    Gr. Tinus

    Beantwoorden
  • 14 december 2018 om 13:33
    Permalink

    Hoi Joost,
    (Bijna) alles werkt, behalve bewolkingsgraad (en dauwpunt, voor mij niet belangrijk). Krijg alleen onderstaande foutmelding:
    2018-12-14 13:28:01.174 Error: EventSystem: in buienradar: [string “–[[ WEERSTATIONS:
    …”]:185: attempt to index field ‘alerts’ (a nil value) ….maar er is geen waarschuwing geweest, zou kunnen kloppen..

    Groet, Ben

    Beantwoorden
  • 15 december 2018 om 13:13
    Permalink

    De kabouters hebben hun werk gedaan: vannacht heeft het script e.e.a. opgepakt en alle ontbrekende units, waaronder bewolkingsgraad en nog een paar dingen, zichtbaar gemaakt. Heb er niks aan veranderd. Update werkt nu ook voor alles. Resume: laat het eerst een paar dagen zijn gang gaan…

    Beantwoorden
  • 26 december 2018 om 13:02
    Permalink

    Dank voor je handleiding. Deel 1 werkt perfect. Bij deel 2 krijg ik toch errors nav mijn script ‘Weerstation’:
    18-12-26 12:54:00.648 Error: EventSystem: Lua script Weerstation did not return a commandArray

    Ik heb meerdere weerstations in de buurt gebruikt maar bij allemaal krijg ik deze error. Wat kan dit zijn?

    Beantwoorden
    • 27 december 2018 om 17:30
      Permalink

      Krijg je de foutmelding incidenteel een keer? Of iedere 5 minuten? Kun je de volledige foutmelding eens posten. Er wordt bij de melding een regelnummer aangegeven.

      Beantwoorden
      • 2 januari 2019 om 15:07
        Permalink

        Ik kreeg deze melding ook elke minuut:
        “Error: EventSystem: Lua script dummyWeatherStationUpdate did not return a commandArray”

        Ik heb dat opgelost door voor de definitie van de UpdateDev function deze 3 regels toe te voegen:

        if commandArray == nil then
        commandArray = {}
        end

        Dit zorgt er voor dat als de variabele commandArray nog niet bestaat deze als lege array wordt gedefinieerd.

        Wat ik heb begrepen zou dit niet nodig moeten zijn als je je script als Event in Domoticz hebt aangemaakt als intepreter ‘LUA’ en eventType ‘time’.

        Beantwoorden
  • 3 januari 2019 om 11:13
    Permalink

    @Joost: Leuke serie artikelen. Daarmee heb ik wat handige functies aan m’n Domoticz kunnen toevoegen. En voor een beginner met Domoticz laat het zien wat kan met LUA en dzVentz event scripts, en een plugin gedaan kan worden.
    @Anne: Bedankt voor het oplossen voor foutmelding.

    Beantwoorden
  • 4 januari 2019 om 11:23
    Permalink

    Goedemorgen,

    Vreemd genoeg krijg ik onderstaande melding:
    2019-01-04 11:18:00.759 Error: EventSystem: in Darksky weerstation: [string ” –[[ WEERSTATIONS: …”]:36: attempt to concatenate field ‘?’ (a nil value)
    Enig idee waar het hem daar in kan zitten?

    De opmerking van Anne van 2 januari heb ik al in het script toegevoegd.

    Alvast dank!

    Beantwoorden
    • 4 januari 2019 om 11:35
      Permalink

      Hoi Steef,

      Kun je even laten zien wat er bij jou op regel 36 staat?
      (Door de aanpassing komen de regelnummers niet meer overeen met het script zoals het hierboven staat)

      Zou het kunnen zijn dat de naamgeving van de sensor zoals die in het script wordt gebruikt niet overeen komt met hoe je het in Domoticz hebt ingevoerd? (Zie regel 25 t/m 31 in het bovenstaande script)

      Anne.

      Beantwoorden
      • 4 januari 2019 om 13:25
        Permalink

        Hoi Anne,

        Natuurlijk, onderstaand mijn regel 36:
        commandArray[#commandArray+1] = {[‘UpdateDevice’] = otherdevices_idx[device]..’|’..tostring(nvalue)..’|’..tostring(svalues)}

        De namen heb ik hetzelfde gehouden, vanwege de waarschuwing in de handleiding dat het dan ook op andere plekken aangepast moest worden. Zo bedreven ben ik nog niet met .lua scripts 🙂

        Beantwoorden
        • 4 januari 2019 om 16:30
          Permalink

          Hoi Steef,

          Ik denk toch dat het in de naamgeving zit.
          Ik had namelijk datzelfde probleem. (De post waar ik dat in uitleg wil echter om de 1 of andere reden niet verschijnen)

          Bij mij waren er 3 sensoren waarbij de namen in de aanmaak instructie en in de code niet overeen kwamen:

          ‘Temperatuur Grond’ – heet als sensor ‘GrondTemperatuur’
          ‘Verwachting uitgebreid’ – heet als sensor ‘Uitgebreide verwachting’
          en
          ‘Temperatuur Dauwpunt’ – heet als sensor ‘Dauwpunt’

          Ik heb dus deze regels aangepast:

          local dev_TempGround = “GrondTemperatuur” — Temperature sensor
          local dev_LongText = “Uitgebreide verwachting” — Text sensor
          local dev_DewPoint = “Dauwpunt” — Temperature sensor

          Daarna werkte dat ook weer.

          Anne.

          Beantwoorden
          • 5 januari 2019 om 10:37
            Permalink

            Er waren inderdaad 3 sensoren van naam veranderd, dit is nu aangepast in het script.

        • 5 januari 2019 om 18:30
          Permalink

          Hoi Steef,

          Wil dat zeggen dat na de aanpassingen van de 3 namen het nu wel goed werkt bij jou?

          Anne.

          Beantwoorden
  • 5 januari 2019 om 20:27
    Permalink

    Goedenavond, nee, ik krijg helaas nog steeds dezelfde melding 😦

    Beantwoorden
    • 5 januari 2019 om 21:50
      Permalink

      Wanneer ik het stukje code uit Anne’s tekst weghaal krijg ik weer de ‘dit not return a command array’ foutmelding.

      Dus er gaat iets nog niet goed, alleen lastig te bepalen waar.

      Beantwoorden
    • 5 januari 2019 om 22:49
      Permalink

      Hoi Steef,

      Om te kunnen bepalen wat er waar fout gaat moeten er (nogal) wat debug statements worden toegevoegd. Als eenmaal is bepaald waar het probleem zit kun je die weer weghalen.

      Vervang de functie updateDev met onderstaande code.
      Na een tijdje zul je dan in de log de informatie zien en dan waarschijnlijk ook kunnen bepalen bij welk device het mis gaat.

      Anne.

      –Functie devices updaten
      function UpdateDev(device,nvalue,svalues)
      print(“UpdateDev(device,nvalue,svalues) check”)
      if (device == nil) then
      print(“device parameter is nil”)
      end
      if (device ~= nil) then
      print(“device”)
      print(device)
      end
      if (otherdevices_idx == nil) then
      print(“otherdevices_idx array is nil”)
      end
      if (otherdevices_idx ~= nil) then
      if (otherdevices_idx[device] == nil) then
      print(“otherdevices_idx[device] is nil”)
      end
      if (otherdevices_idx[device] ~= nil) then
      print(“otherdevices_idx[“..device..”]”)
      print(otherdevices_idx[device])
      end
      end
      if (nvalue == nil) then
      print(“nvalue parameter is nil”)
      end
      if (nvalue ~= nil) then
      print(“nvalue”)
      print(nvalue)
      end
      if (svalues == nil) then
      print(“svalues parameter is nil”)
      end
      if (svalues ~= nil) then
      print(“svalues”)
      print(nvalue)
      end
      commandArray[#commandArray+1] = {[‘UpdateDevice’] = otherdevices_idx[device]..’|’..tostring(nvalue)..’|’..tostring(svalues)}
      end

      Beantwoorden
  • 6 januari 2019 om 14:24
    Permalink

    Goedemiddag,

    Volgens mij doe ik gewoon iets grandioos verkeerd, ik krijg namelijk onderstaande foutmelding:

    2019-01-06 14:21:00.565 Error: EventSystem: in Darksky weerstation: [string ” –[[ WEERSTATIONS: …”]:38: unexpected symbol near char(226)

    Regel 38 is na toevoegen van het script de onderstaande regel:
    print(“UpdateDev(device,nvalue,svalues) check”)

    Beantwoorden
  • 6 januari 2019 om 16:26
    Permalink

    Als ik bovenstaande handeling uitvoer, krijg ik het volgende:
    2019-01-06 15:42:00.628 Error: EventSystem: in Buienradar: [string “–[[ WEERSTATIONS:
    …”]:34: unexpected symbol near char(226)

    Beantwoorden
  • 6 januari 2019 om 17:03
    Permalink

    Kun je/jullie je script (met domo_ip en api_key leeg gemaakt) eens ergens uploaden, dan kan ik kijken of ik er achter kan komen wat er mis is.

    Anne.

    Beantwoorden
    • 8 januari 2019 om 00:55
      Permalink

      Hoi Steef,

      Ik zie niet direct een probleem met dit script.
      Welk foutmelding geeft deze versie?

      Anne.

      Beantwoorden
      • 8 januari 2019 om 09:20
        Permalink

        Hoi Anne,

        Hij blijft de melding Error: EventSystem: in Darksky weerstation: [string ” –[[ WEERSTATIONS: …”]:36: attempt to concatenate field ‘?’ (a nil value) geven bij mij. Terwijl ik wel een paar waarden (cloud cover en weersverwachting voor morgen) doorkrijg.

        Gisteren gaf hij nog een authentificatie error, maar die is opgelost.

        Beantwoorden
        • 8 januari 2019 om 10:06
          Permalink

          Het bijzondere is wel, hij geeft nu elk half uur de melding, terwijl de updates voor zover ik kan zien nog steeds elke 5 minuten binnen komen.

          Beantwoorden
          • 9 januari 2019 om 14:36
            Permalink

            Hoi Steef,

            Dat het maar eens in de 30 minuten is ipv eens in de 5 minuten is al weer een goede indicatie waar het probleem zou kunnen zitten.

            Er zijn 2 delen van het script die elke 5 minuten draaien.
            Onderaan staat de buienradar verwachting, die elk half uur wordt uitgevoerd.

            Ik heb het script dat je deelde aangepast zodat hij wat meer informatie geeft bij het updaten
            Zie de functie
            function UpdateDev(device,nvalue,svalues)

            en ook de buienradar verwachting elke keer dat het script wordt aangeroepen uitvoert
            Zie de regel met
            if (true) then —

            Samen zou je dat een idee moeten geven waar het probleem zou moeten zitten.

            Het aangepaste script:
            https://drive.google.com/open?id=1kE2yXL7C63hASCnW2VdKH8Kt_0Bi3Wga

            Anne.

  • 7 januari 2019 om 15:47
    Permalink

    Alles weer terug naar zoals het was, nu dus weer dit iedere 5 minuten:

    2019-01-07 15:33:00.777 Error: EventSystem: in Buienradar: [string “–[[ WEERSTATIONS:
    …”]:33: attempt to get length of global ‘commandArray’ (a nil value)
    2019-01-07 15:34:00.492 Error: EventSystem: Lua script Buienradar did not return a commandArray
    2019-01-07 15:35:00.644 Error: EventSystem: Lua script Buienradar did not return a commandArray
    2019-01-07 15:36:00.771 Error: EventSystem: Lua script Buienradar did not return a commandArray
    2019-01-07 15:37:00.803 Error: EventSystem: Lua script Buienradar did not return a commandArray

    Beantwoorden
    • 8 januari 2019 om 01:17
      Permalink

      Hoi René,

      De foutmelding over het missende commandArray kun je zoals gezegd oplossen door _voor_ de UpdateDev() functie de onderstaand regels toe te voegen. Die controleren of commandArray niet gedefinieerd is (nil is) en zo ja maken het aan als lege array/table/sequence.

      if commandArray == nil then
      commandArray = {}
      end

      Ik heb je script bekeken en zie daar verder niet direct fouten in.
      Het enige dat ik nog als suggestie zou kunnen doen is om de namen (en typen) van de sensoren die je hebt aangemaakt nog eens goed te controleren dat er geen typeouten in zitten.

      Als je dus de commandArray regels hebt toegevoegd om de melding over missend commandArray op te lossen dan zou het moeten werken.

      Ik neem aan dat je het als lua script van het type Time hebt aangemaakt?

      Als je in je browser je domoticz kunt benaderen via poort 443, dan zou dat eigenlijk moeten werken, maar het kan wel tot vreemd gedrag leiden. 443 is normaal gezien namelijk de https poort, en het zou kunnen zijn dat je dan een (signed) certificate moet gebruiken om het geheel vlekkeloos te laten verlopen.

      Anne.

      Beantwoorden
  • 8 januari 2019 om 10:25
    Permalink

    Goede morgen Anne, dit werkt, maar er komt nu een volgend probleem:

    Onderstaand deel is het deel van het script wat DarkSky aanroept, en daar komt op de regel die de latitude aanroept de volgende fout:
    2019-01-08 10:23:00.919 Error: EventSystem: in Buienradar: [string “–[[ WEERSTATIONS:
    …”]:110: attempt to index local ‘jsonData’ (a nil value)

    (Dat is deze regel: lat = jsonData.Location.Latitude )

    Hier het gedeelte van het script:
    —————————————
    — ######## Darksy API call ######## —
    —————————————
    if ((time.min+2)%5)==0 then — Script loopt iedere 5 minuten (bv. 11.03, 11.08, 11.13, 11.18, etc.
    json = (loadfile “/home/pi/domoticz/scripts/lua/JSON.lua”)() — For Linux
    local config=assert(io.popen(‘curl “http://’..domo_ip..’/json.htm?type=settings”‘))
    local Stringjson = config:read(‘*all’)
    config:close()
    local jsonData = json:decode(Stringjson)
    — Convert the json to a LUA table
    lat = jsonData.Location.Latitude
    lon = jsonData.Location.Longitude
    local coord = lat..”,”..lon

    json = (loadfile “/home/pi/domoticz/scripts/lua/JSON.lua”)() — For Linux
    local config=assert(io.popen(‘curl “https://api.darksky.net/forecast/’..api_key..’/’..coord..’?lang=’..language..’&units=si&exclude=hourly,flags”‘))
    local Stringjson = config:read(‘*all’)
    config:close()
    local jsonData = json:decode(Stringjson)
    — Convert the json to a LUA table
    if jsonData ~= nil then — this sometimes happens around midnight
    val_UV = jsonData.currently.uvIndex
    val_Ozone = jsonData.currently.ozone
    val_DewPoint = round(jsonData.currently.dewPoint,1)
    val_CloudCover = jsonData.currently.cloudCover*100
    end

    if debug==1 then
    print(“Bewolkingsgraad : “..val_CloudCover.. ” %”)
    print(“UV-kracht :”..val_UV)
    print(“Ozone : De ozone-waarde is “..val_Ozone)
    print(“Dauwpunt : “..val_DewPoint.. ” °C”)
    end

    — Domoticz devices updaten
    UpdateDev(dev_CloudCover,0,val_CloudCover)
    UpdateDev(dev_DewPoint,0,val_DewPoint)
    UpdateDev(dev_UV,0,val_UV..”;0″)
    UpdateDev(dev_Ozone,0,val_Ozone)

    if debug==1 then
    print (“Dauwpunt: “..val_DewPoint..” °C”)
    print (“Bewolkingsgraad: “..val_CloudCover..” %”)
    print (“UV-Index: “..val_UV)
    print (“Ozone: “..val_Ozone)
    end
    end

    Beantwoorden
  • 9 januari 2019 om 15:42
    Permalink

    Goedemiddag, dank voor het aangepaste script!

    Ik krijg het onderstaande uit de log:
    2019-01-09 15:40:00.497 Status: dzVents: Info: WUS: —— Finished updateWeatherSensors.lua
    2019-01-09 15:40:01.363 Status: LUA: Uitgebreid: Meer zon, vannacht lichte vorst!
    2019-01-09 15:40:01.363
    2019-01-09 15:40:01.363 Vandaag zien we in het hele land de zon weer eens tevoorschijn komen. Ook doet de temperatuur een stapje terug. Het frissere, drogere weer is echter van korte duur.Vanmiddag zijn er flinke zonnige perioden en het blijft droog. De temperatuur komt uit op een graad of 7 en de noordenwind is matig tot krachtig. Vanavond verdwijnt de laatste bewolking waarna de nacht vrij helder verloopt. Daardoor koelt het flink af met in het binnenland lichte vorst! De minima liggen tussen + 1 graad langs de kust en -1 tot -3 graden in het binnenland. In de loop van de nacht raakt het vanuit het noordwesten opnieuw bewolkt. Daarnaast zwakt de noordenwind af. Morgen (na het krabben van de autoruiten) begint de dag in het binnenland met een glimp van de zon. Verder is het bewolkt en in de loop van de middag gaat het vanuit het noordwesten licht regenen. Het is een stuk frisser dan de afgelopen dagen met de middagtemperatuur tussen 2 graden langs de oostgrens en een graad of 6 aan zee. Er staat een zwakke tot matige noordenwind.De dagen daarna is het tamelijk wisselvallig en vrij zacht. De bewolking heeft duidelijk de overhand en er valt soms regen, vooral op zaterdag. In de middag wordt het een graad of 8 en de nachten verlopen vorstvrij.
    2019-01-09 15:40:01.363
    2019-01-09 15:40:01.363
    2019-01-09 15:40:01.363 Status: LUA: UpdateDev(device,nvalue,svalues) check
    2019-01-09 15:40:01.363 Status: LUA: otherdevices_idx[device] is nil
    2019-01-09 15:40:01.363 Error: EventSystem: in Darksky weerstation: [string ” –[[ WEERSTATIONS:
    …”]:54: attempt to concatenate field ‘?’ (a nil value)
    2019-01-09 15:40:03.539 Status: Notification sent (Email)

    Hij lijkt dus vast te zitten op de otherdevices_idx[device] op een of andere manier.

    Wat ook bijzonder is, is dat ik nu opeens de uitgebreide omschrijving ontvang (in de log, niet in de switch). Die kreeg ik daarvoor niet, dus ik heb het vermoeden dat het daar ergens zit.

    Beantwoorden
    • 9 januari 2019 om 20:40
      Permalink

      Om nog even op mijn eigen reactie terug te komen, op wonderbaarlijke wijze werkt het nu zonder foutmeldingen. De debug in het UpdateDev gedeelte heb ik teruggezet naar het oude, in het Buienradar deel staat het nog vanuit jouw stuk code. Dat laat ik ook maar zo, want zo werkt het, haha!

      Beantwoorden
      • 10 januari 2019 om 17:00
        Permalink

        Hoi Steef,

        De regel
        if (true) then — if ((time.min+2)%30)==0 then — Script loopt iedere 30 minuten (bv. 11.28, 11.58, 12.28, 12.58, etc.
        kun je het beste weer
        if ((time.min+2)%30)==0 then — Script loopt iedere 30 minuten (bv. 11.28, 11.58, 12.28, 12.58, etc.
        van maken, anders belast je het systeem denk ik te veel.

        Als je nog wil weten met welke waar het (wrs soms) mis gaat zou je dit nog in de dev update functie kunnen opnemen:
        if (otherdevices_idx ~= nil) then
        if (otherdevices_idx[device] == nil) then
        print(“otherdevices_idx[device] is nil”)
        print(“device”)
        print(device)
        end
        end

        Die laat dan ook de naam van het device zien waarvan de otherdevices_idx array/table niet gevonden wordt. (Dat moet eigenlijk haast wel een naamgeving issue zijn)

        Beide veel plezier er mee.

        Anne.

        Beantwoorden
  • 10 januari 2019 om 11:49
    Permalink

    Goede moergen Anne,
    Hier een beetje hetzelfde verhaal, af en toe komt er foutmelding langs, en dan een dag niet meer.
    Gaat verder wl goed zo, bedankt voor het meedenken.

    Beantwoorden
  • 11 januari 2019 om 08:18
    Permalink

    Hoi Anne,
    Dank voor de input, ik heb de regel even aangepast.

    Zo af en toe geeft hij nog een foutmelding, maar dat lijkt compleet random te zijn (afgelopen nacht iets na 00:00 4x op val_WindSpeedTomorrow, daarna niet meer)

    Hartelijk dank voor alle geboden ondersteuning!

    Beantwoorden
  • 11 januari 2019 om 08:57
    Permalink

    Beste Anne, ik heb ook gisteren alles geinstalleerd op mijn domoticz.
    Eerst kreeg ik vanuit dit script de error:
    2019-01-11 08:37:00.659 Error: EventSystem: Lua script wusScript did not return a commandArray
    2019-01-11 08:38:01.000 Error: EventSystem: in wusScript: [string “–[[ WEERSTATIONS:
    …”]:33: attempt to get length of global ‘commandArray’ (a nil value)

    Ik heb dat opgelost door, zoals hierboven omschreven, voor de definitie van de UpdateDev function deze 3 regels toe te voegen:

    if commandArray == nil then
    commandArray = {}
    end

    Nu krijg ik iedere 5 minuten de volgende error, en ik weet niet hoe ik dit moet oplossen
    2019-01-11 08:53:01.171 Error: EventSystem: in wusScript: /home/pi/domoticz/scripts/lua/JSON.lua:660: html passed to JSON:decode(): Unauthorized401 Unauthorized

    Misschien kun je me helpen
    Rudi

    Beantwoorden
    • 12 januari 2019 om 08:24
      Permalink

      Ondertussen zijn alle issues opgelost.
      Ik heb de UpdateDev functie overgenomen.
      Verder had ik een typefout in een device gemaakt (Temperatuur Dauwpunt i.p.v. Dauwpunt)
      Als laatste had ik in mijn Domoticz>Settings>local networks het IP-adres van mijn RPI niet staan. Deze toegevoegd en ik heb geen errors meer, ook alle devices worden gevuld.

      Beantwoorden
      • 12 januari 2019 om 12:22
        Permalink

        Hoi Rudi,

        Altijd mooi als problemen zich ‘vanzelf’ oplossen 😉

        Ik heb al 2 keer gepoogd een stukje te posten met uitleg hoe ik het bij mij aan de praat heb gekregen (onder Windows), maar om de een of andere reden komt dat stukje hier niet terecht.

        Het belangrijkste dat daar in stond is inderdaad dat je de gebruikte namen goed controleert. Dat wat in het script staat ook precies overeen komt met wat je in Domoticz hebt aangemaakt.
        De namen zijn volgens mij ook ‘hoofdletter gevoelig’, dus ook het gebruik van hoofdletters en kleine letters moet precies overeen komen. Zelfs als je de instructie goed volgt kan het zijn dat er een (klein) verschil in zit en dan werkt het niet.

        Ik denk overigens dat het toevoegen van je RPI aan de local networks er voor gezorgd heeft dat je de ‘unauthorized access’ fout niet meer krijgt.

        Anne.

        Beantwoorden
  • 15 januari 2019 om 12:29
    Permalink

    Hallo
    Sinds gisteren krijg ik de volgende foutmelding:

    Error: EventSystem: in Weerstation: [string “…”]:60: attempt to index local ‘jsonData’ (a nil value)

    En verschillene switches worden dan niet meer geupdated (zoals Lux Calulated en Lux Solar Powertime)

    Is er iets veranderd?
    gr.

    Cor

    Beantwoorden
  • 15 januari 2019 om 14:17
    Permalink

    Hoi Cor,

    Dit zijn volgens mij 2 verschillende dingen.

    Het regelnummer 60 komt niet helemaal overeen met het bovenstaande script, maar ik denk dat het een gevolg is van het niet goed kunnen inlezen van
    https://api.buienradar.nl/data/public/2.0/jsonfeed

    Is dit een fout die elke 5 minuten optreed, of alleen zo nu en dan?
    Dat laatste kan voor komen.

    De Lux devices worden in de script van Deel 1 geupdate maar staan dus los van de jsonData melding: de variabele jsonData wordt in die scripts niet gebruikt.

    Beantwoorden
    • 15 januari 2019 om 15:56
      Permalink

      Het was idd een probleem van mijn dns-server. Dns-probleem opgelost en backup teruggezet.
      Nu is de foutmelding weg en mijn Lux Calculated wordt weer netjes bijgewerkt.
      Dank voor de tip.

      Beantwoorden

Geef een reactie

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