Om een aangelegde besproeingsinstallatie op een zo efficiënt mogelijke manier te gebruiken is het natuurlijk wel mooi als je over actuele neerslag gegevens kunt beschikken. Een gazon sproeien als het net heeft geregend is immers niet erg zinvol.

Natuurlijk hebben we bij de HAShop hele mooie Z-Wave regenmeters te koop.

Maar wat doe je nu als je net aan het migreren bent van een oude 433MHz oplossing naar een domoticainstallatie op basis van Z-wave. Dan zou het natuurlijk fantastisch zijn als je je oude regenmeter nog zou kunnen blijven gebruiken.

Deze oplossing is daarom met name geschikt voor klanten die al over een bestaande regenmeter beschikken. In dit voorbeeld betreft het een reeds bestaande installatie op basis van een RaspberryPi met Domotics waarop via een RfxCom antenne een PCR800 Oregon regenmeter is aangesloten.


Met enkele aanpassingen zou deze oplossing trouwens moeten werken met iedere regenmeter die met behulp van een RfxCom of FX-link op Domoticz kan worden aangemeld.

Om de koppeling met de Fibaro te realiseren maken we eerst een Virtual Device aan. Bij de algemene gegevens vullen we het IP adres van de Domoticz installatie in evenals het poortnummer waarop deze Domoticz controller kan worden benaderd (standaard 8080).

Op het tabblad Geavanceerd maken we voor dit Virtual Device 4 labels aan met de namen:

  • Labelnaam: Het regent nu / LabelID: RainRate
  • Labelnaam: Totaal vandaag / LabelID: RainToday
  • Labelnaam: Afgelopen 7 dgn / LabelID: Past7Days
  • Labelnaam: Bijgewerkt / LabelID: LastUpdate

Hiervan markeren we RainToday als hoofditem (mm regen sinds 00:00 uur) zodat dit gegeven standaard in het Virtual Device wordt getoond.

Om een indruk te krijgen van de data die we via de Domoticz api kunnen opvragen roepen we in een browser de volgende URL aan:

http://<Domoticz-IP adres>:<Domoticz poortnummer>/json.htm?type=devices&rid=<Domoticz ID van de regenmeter>

Vul hierbij bij de "<...>" de gegevens in van uw eigen Domoticz installatie. Hierbij krijgt u een pagina met gegevens die er ongeveer als volgt uit zal zien:

{
   "ActTime" : 1480005422,
   "ServerTime" : "2016-11-24 17:37:02",
   "Sunrise" : "08:13",
   "Sunset" : "16:28",
   "result" : [
      {
         "AddjMulti" : 1.0,
         "AddjMulti2" : 1.0,
         "AddjValue" : 0.0,
         "AddjValue2" : 0.0,
         "BatteryLevel" : 100,
         "CustomImage" : 0,
         "Data" : "0;1627.9",
         "Description" : "",
         "Favorite" : 1,
         "HardwareID" : 3,
         "HardwareName" : "RFXcom",
         "HardwareType" : "RFXCOM - RFXtrx433 USB 433.92MHz Transceiver",
         "HardwareTypeVal" : 1,
         "HaveTimeout" : false,
         "ID" : "3F00",
         "LastUpdate" : "2016-11-24 17:34:54",
         "Name" : "Regenmeter",
         "Notifications" : "false",
         "PlanID" : "4",
         "PlanIDs" : [ 4 ],
         "Protected" : false,
         "Rain" : "13.3",
         "RainRate" : "0.0",
         "ShowNotifications" : true,
         "SignalLevel" : 4,
         "SubType" : "PCR800",
         "Timers" : "false",
         "Type" : "Rain",
         "TypeImg" : "rain",
         "Unit" : 0,
         "Used" : 1,
         "XOffset" : "0",
         "YOffset" : "0",
         "idx" : "3"
      }
   ],
   "status" : "OK",
   "title" : "Devices"
}

Dat betekent dat we de nodige bewerkingen zullen moeten doen om de juiste gegevens hier uit te halen. Hiervoor brengen we in de Main Loop van het Fibaro Virtual Device een aantal regels Lua code aan.

-------------------------------------------------------------------------------------------
-- Read Oregon PCR800 RainGauge values
-- connected through a RaspberryPi with Domoticz and an RfxCom transceiver
--
-- Henk Kuipers
-- https://onsheim.nl
-- 20170227
-------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------
-- Parameters
-------------------------------------------------------------------------------------------
local RainGaugeID = 3; -- Domoticz ID assigned to the RainGauge
-------------------------------------------------------------------------------------------


-- No changes below this line
-------------------------------------------------------------------------------------------
-- Read the Domoticz Address and Port from the Virtual Device panel
local ThisDevice = fibaro:getSelfId();
local IP = fibaro:getValue(ThisDevice, "IPAddress");
local Port = fibaro:getValue(ThisDevice, "TCPPort");

--Use Domoticz api to request the RainGauge output
local Domoticz = Net.FHttp(IP, Port);
local Result, Status, ErrorCode = Domoticz:GET("/json.htm?type=devices&amp;amp;rid=" .. RainGaugeID);
--Status and error messages (not used yet)

--Find the beginning and the end of the RainGauge RainRate value 
--This value is located between the words Rain and RainRate
local a, b = string.find(Result, "Rain..:");
local c, d = string.find(Result, "RainRate");

--Extract the RainGauge 24 hours value, skipping leading and trailing characters
GaugeValue = string.sub(Result, b + 3, c - 14 );
--Save value for past 7 Days calculation
fibaro:setGlobal("D_RainToday", GaugeValue);
--Set the Virtual Device Label value including the "mm" text
fibaro:call(ThisDevice, "setProperty", "ui.RainToday.value", GaugeValue  .. " mm");

--Find the beginning and the end of the RainGauge RainRate value 
--This value is located between the words RainRate and ShowNotifications
local a, b = string.find(Result, "RainRate");
local c, d = string.find(Result, "ShowNotifications");
-- Extract the RainGauge RainRate value, skipping some leading and trailing characters
GaugeValue = string.sub(Result, b + 6, c - 14 );
-- Set the Virtual Device label value
fibaro:call(ThisDevice, "setProperty", "ui.RainRate.value", GaugeValue .. " mm/uur");

-- Calculate amount of rain in the past seven days and display this in Virtual Device
local Counter = 1;
local SevenDaysTotal = 0;
while Counter ~= 8 do
  SevenDaysTotal = SevenDaysTotal + fibaro:getGlobal("D_Rain_" .. Counter);
  Counter = Counter + 1;
end  
fibaro:call(ThisDevice, "setProperty", "ui.Past7Days.value", SevenDaysTotal .. " mm");

-- Extract the last updated data as provided by Domoticz
-- This value is located between the words "LastUpdate" and "Name"
-- and display it in the Virtual Device
local a, b = string.find(Result, '"LastUpdate"');
local c, d = string.find(Result, '"Name"');
-- Extract the last updated value, skipping leading and trailing characters
GaugeValue = string.sub(Result, b + 5, c - 13 );
--Write the Virtual Device Label
fibaro:call(ThisDevice, "setProperty", "ui.LastUpdate.value", GaugeValue);

De code lijkt ingewikkelder dan dat deze in werkelijkheid is. Het enige dat we doen is bepalen op welke positie de door ons gewenste gegevens zich bevinden en deze vervolgens te verwerken.

Vervolgens hebben we nog een stukje Lua code nodig om de dagelijkse neerslaghoeveelheden een aantal dagen te onthouden. Hiervoor maken we een scene aan met de naam: Remember Rain

--[[
%% autostart
%% properties
%% weather
%% events
%% globals
--]]

-------------------------------------------------------------------------------
-- Remember the rain of the past seven days
-------------------------------------------------------------------------------
--
-- Every night the values in the global variables will be shifted forward
-- so the amount of rain of today will be stored in "D_Rain_1"
-- "D_Rain_1" will be stored in "D_Rain_2" and so on. 
--
-- Henk Kuipers
-- https://onsheim.nl
-- 20170228
--
-------------------------------------------------------------------------------
-- Parameter section
-------------------------------------------------------------------------------
local RainGaugeID = 348; -- Fibaro ID of the RainGauge Virtual Device
-- Make sure the today rainamount in the VD is stored under the label "Today" 
-- and global variables "D_Rain_1" .. "D_Rain_7" are present
-------------------------------------------------------------------------------

-- No changes below this line
-------------------------------------------------------------------------------
local sourceTrigger = fibaro:getSourceTrigger();

function tempFunc()
  local currentDate = os.date("*t");
  local startSource = fibaro:getSourceTrigger();
  local Counter = 6;
  
  -- Only run at 23:59 (skip one minute to compensate clock difference
  -- between the Fibaro HC2 and the Domoticz system
  if (
    ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "23:59") )
    )
  then
    -- Shift all the existing values one position
    while Counter ~= 0 do
      fibaro:setGlobal("D_Rain_" .. Counter + 1, fibaro:getGlobal("D_Rain_" .. Counter, value));
      Counter = Counter - 1;
    end
    
    -- Finally save the today amount of rain in "D_Rain_1
    fibaro:setGlobal("D_Rain_1", fibaro:getGlobalValue("D_RainToday"));
  end
  -- Make sure the function runs every minute
  setTimeout(tempFunc, 60*1000)
end

-- Schedule script execution every minute
if (sourceTrigger["type"] == "autostart") then
  tempFunc()
end