Logging von zB Temperatur

@volker1, Der letzte Datenpunkt im Diagramm ist vom 23.04. 13 Uhr. Wenn bei Dir das auch so ist, schließe ich daraus dass es ein allgemeines Problem ist und nicht account basierend. Kannst Du das mal prüfen?

Hallo Ändy,

Ja fast, bei mir ist es der 23. April 15:03 Uhr.
Sieht dann wirklich nach einem allgemeinen Problem beim Anbieter aus…

Viele Grüße
Volker

Hier das Selbe, gleiche Zeit, also plus minus die lokalen Zeitverschiebungen (bei mir letzter Status um 14.03)
Näheres konnte ich bisher auch noch nicht in Erfahrung bringen können :frowning:

Gruß
Rik

Scheint wieder zu laufen. Daten sind erhalten geblieben.

jupp - hatte denen an dem Tag noch ne Anfrage gesendet, kurz danach hab ich nen Antwort bekommen vom Support und es funktionierte wieder. Vielleicht Zufall :slight_smile:

Moin,
Jahre später, aber für mich als blutigen Anfänger rechtzeitig, greife ich das Thema noch mal auf.
Meine Sensoren laufen über das Scrpit von Dan bzw. Ändy hervorragend bei allthingstalk auf und werden dort auch dargestellt.
Nun möchte ich gern auch die Verbrauchswerte meiner Wall-Plugs mittels des Scripts in allthingstalk exportieren - scheitere aber jämmerlich mit meinen Modifikationen. Kann mir evtl.jemand einen Tipp geben, wo mein Fehler ist ?

--[[
%% autostart
%% properties
22
23
38
26 value
%% events
8
10 power
--]]


-- Scene         : All Things Talk Test
-- Version       : 1.4
-- Date Created  : 09 June 2016
-- Last Changed  : 03 February 2019
-- HC Version    : Home Center 2 v4.510
-- Created By    : Dave Harrison

-- Purpose       : To test sending data to AllThingsTalk.io
-- Trigger       : Triggered by implemented Timer or by devices/global variables

-- Revision History
-- ----------------

-- 1.2 19-Nov-16    SmartLiving.io rebranded as AllThingsTalk.io
-- 1.3 12-Nov-18    New authentication method
-- 1.4 03-Feb-19    AndyY: Add global variable feature, integrate timer and reduce transmitted data

--====================================================
-------------------- Declaration: Local Variables
--====================================================

--Transmit Data only from triggered device/global. Can help reducing data. Choose false
--to transmit datas from all devices/globals at once no matter they were triggered or not.
--Make shure deviceIds filled in after %%properties or globals after %%globals at beginning
--of scene (trigger section).
local OnlyTriggerDev = true --true/false.

--Additional trigger by timer. All devices will be transmitted at once no matter they were
--triggered or not.
local TriggerByTimer = true --true/false
local TimerValue = 15 --in minutes

local debug = true

--local currentDateISO = os.date("%Y-%m-%dT%XZ")
local currentDateISO = "" --If time is not korrekt in allthingstalk, try this setting instead the line before

--Devices/Globals
local devices =
{
  WoZiThermostat1 = {deviceId = 22, property = "value",assetId = "4kCkYqUu46IyiacRHmKoqkle"},
  WoZiThermosensor1 = {deviceId = 23, property = "value", assetId = "mdKJt6gKihgVvuOlL9hEFKom"},
  ZRain = {deviceId = 38, property = "value", assetId = "TLr82bJp2k3BID3eIDCOXYSt"},
  HeizungThermosensor1 = {deviceId = 26, property = "value", assetId = "xOVHgVyZ7hQwCWsRmlZz5JFo"},
  FibaroWallPlugCooler = {deviceId = 10, property = "power", assetId = "YJEzdAdmukxgvywYDZwSjKoh"},
  FibaroWallPlugWoZi = {deviceId = 8, property = "power", assetId = "oAWMs4DFAOOLBJuomlTnaoLM"},
--Global =     {VarName = "GlobalName", property = "global", assetId = "xxxxxxxxxxxxxxxxxxxxxxxx"},
}

--====================================================
-------------------- Functions
--====================================================

local function log(str) if debug then fibaro:debug(str); end; end
local function errorlog(str) fibaro:debug("<font color='red'>"..str.."</font>"); end

local function sendData (assetId, requestBody)
  local deviceToken ="maker:XXXXXXXX"    -- Replace maker:xxxxxxxxx with your Device Authentication Token
  local url = "https://api.allthingstalk.io/asset/" .. assetId .. "/state"
  local httpClient = net.HTTPClient({timeout=5000})
 
  local httpHeaders =
      {
        ["Authorization"] = "Bearer " .. deviceToken,
        ["Content-Type"] = "application/json",
      }
 
  httpClient:request(url, {
    options={
      headers = httpHeaders,
      data = requestBody,
      method = 'PUT',
      timeout = 5000,
      checkCertificate = false,
    },
    success = function(response)
      if (response.status >= 200 and response.status < 300) then
        log(assetId .. ": " .. response.status .. " - successful")
      else
        errorlog(assetId .. ": " .. "ERROR")
      end
    end,
    error = function(error)
      errorlog(assetId .. ": " .. "ERROR")
      log(error)
    end
  })
end

--====================================================
-------------------- Main
--====================================================

-- Send data to AllThingsTalk
-- --------------------------
local function main()

    local sourceTrigger = fibaro:getSourceTrigger()
    local requestData = {}

    log("---")
    log(os.date("%a %d %b") .. " | Trigger: ".. sourceTrigger["type"] .. " | Name: " .. tostring(sourceTrigger['name']) .. " | Id: " .. tostring(sourceTrigger.deviceID))

    -- Check each device and format the request data
    for i, device in pairs(devices) do

        --check source trigger
       local trigger
        if sourceTrigger.deviceID ~= nil then
            trigger = sourceTrigger.deviceID
        elseif sourceTrigger["type"] == "global" then
            trigger = sourceTrigger['name']
        end
      
        --only triggered device/global. All devices if trigger by manual, from other scene or by timer
        if device.deviceId == trigger or device.VarName == trigger
        or sourceTrigger["type"] == "other" or OnlyTriggerDev == false then
      
            --check if property or power
            local valueId
            if device.property ~= "value" then
                valueId = tonumber(fibaro:getValue(device.deviceId, device.property)) --property
            elseif device.property ~= "power" then
                valueId = tonumber(fibaro:getValue(device.deviceID, valueSensor)) --power
            end
            
            requestData = {value = valueId, at = currentDateISO}
            local requestBody = json.encode(requestData)
       
            --check value
            if valueId ~= nil then
                log(i .. ": " .. requestBody)
                sendData(device.assetId, requestBody) -- Send the data
            else
                errorlog(i .. ": " .. requestBody)
            end
        
        end

    end

    --check trigger
      local setTimer
    if TriggerByTimer == true then
          --if OnlyTriggerDev == false and sourceTrigger["type"] == "property" then setTimer = true end
        if sourceTrigger["type"] == "other" or sourceTrigger["type"] == "autostart" then setTimer = true end
    end
      --timer restart
    if setTimer then
          setTimeout(main, TimerValue*60*1000) --Restart mainloop
        log("Set timer " .. TimerValue .. " minutes")
      end

end

--mainloop
main()

Danke schon mal …

Hab jetzt den nachfolgenden Teil geändert und es funktioniert, scheint mir aber unelegant …

--check if power or value
            local valueId
            if device.deviceId <= 10 then
                valueId = tonumber(fibaro:getValue(device.deviceId, "power")) --power
            elseif device.deviceId > 10 then
                valueId = tonumber(fibaro:getValue(device.deviceId, "value")) --value
            end

Hi,

hab Dir schon im Fibaro Forum geantwortet :smile: Ich bekomme hier leider keine Benachrichtigungen mehr. Somit den Beitrag zu spät gesehen…Hoffe es klappt. Wenn nicht, einfach melden.

Auch hier noch mal vielen Dank …

Moin,
nachdem das nun mit allthingstalk sehr gut klappt, habe ich mir überlegt, dass es ja auch möglich sein müsste, Sensor- und Verbrauchsdaten in ähnlicher Weise in eine definierte Datei im Heimnetz zu schreiben, z.B. in eine csv auf einer NAS. Gibt das HC2 in Verbindung mit LUA sowas “im Baukasten” her oder muss hierzu ein ganz großes Rad gedreht werden?
Den indirekten Weg über die Export-Funktionen im HC2 bzw in allthingstalk habe ich mir bereits angesehen, aber ist halt indirekt mit viel Nacharbeit.
Ich stelle mir eine Sensor-/Verbrauchsdaten-bezogenen Datei vor, die ungefähr wie eine Lastgangtabelle aussieht:

WallPlug1			
info1			
info2			
info3			
			
			
			
			
Date	     Time	Wert	Einheit
01.01.2014	00:15	8,2	    W
01.01.2014	00:30	8,2	    W
01.01.2014	00:45	8,7	    W
01.01.2014	01:00	7,96	W
01.01.2014	01:15	9,52	W
01.01.2014	01:30	10,1	W
01.01.2014	01:45	9,5	    W
01.01.2014	02:00	14,5	W
01.01.2014	02:15	17,66	W
01.01.2014	02:30	9,8	    W
01.01.2014	02:45	8,74	W
01.01.2014	03:00	9,54	W
01.01.2014	03:15	8,84	W
01.01.2014	03:30	8,1	    W
01.01.2014	03:45	8,04	W
01.01.2014	04:00	8,08	W
01.01.2014	04:15	8,36	W
01.01.2014	04:30	8,92	W
01.01.2014	04:45	7,96	W
…			

Viele Grüße
Axel

@AxelR:
kannst Du mir mal erklären wo Du diesen Teil geändert hast? Ich habe auch schon länger vor die Verbrauchswerte zu loggen, aber mangels Wissen von LUA noch keinen Erfolg gehabt.
Ebenfalls wäre ich an einer Lösung interessiert, die Daten direkt zu speichern :wink:

Danke und Gruß
Rik

Moin,

das Script für das Loggen von Sensor- und Verbrauchsdaten habe ich nachfolgend angepasst:

--[[
%% autostart
%% properties
22
23
38
26 value
6
8
10 
15 power
%% events
globals
GlobalName
--]]


-- Scene         : All Things Talk Test
-- Version       : 1.4
-- Date Created  : 09 June 2016
-- Last Changed  : 03 February 2019
-- HC Version    : Home Center 2 v4.510
-- Created By    : Dave Harrison

-- Purpose       : To test sending data to AllThingsTalk.io
-- Trigger       : Triggered by implemented Timer or by devices/global variables

-- Revision History
-- ----------------

-- 1.2 19-Nov-16    SmartLiving.io rebranded as AllThingsTalk.io
-- 1.3 12-Nov-18    New authentication method
-- 1.4 03-Feb-19    AndyY: Add global variable feature, integrate timer and reduce transmitted data

--====================================================
-------------------- Declaration: Local Variables
--====================================================

--Transmit Data only from triggered device/global. Can help reducing data. Choose false
--to transmit datas from all devices/globals at once no matter they were triggered or not.
--Make shure deviceIds filled in after %%properties or globals after %%globals at beginning
--of scene (trigger section).
local OnlyTriggerDev = true --true/false.

--Additional trigger by timer. All devices will be transmitted at once no matter they were
--triggered or not.
local TriggerByTimer = true --true/false
local TimerValue = 15 --in minutes

local debug = true

--local currentDateISO = os.date("%Y-%m-%dT%XZ")
local currentDateISO = "" --If time is not korrekt in allthingstalk, try this setting instead the line before

--Devices/Globals
local devices =
{
--examples:
  AckiWoZiThermostat1 = {deviceId = 22, property = "value",assetId = "4kCkYqUu46IyiacRHmKoqkle"},
  AckiWoZiThermosensor1 = {deviceId = 23, property = "value", assetId = "mdKJt6gKihgVvuOlL9hEFKom"},
  FibaroWallPlugAckiWoziTV = {deviceId = 6, property = "power", assetId = "W2FEgulAQA8BV0dGZG7C5WjS"},
  ZRain = {deviceId = 38, property = "value", assetId = "TLr82bJp2k3BID3eIDCOXYSt"},
  HeizungThermosensor1 = {deviceId = 26, property = "value", assetId = "xOVHgVyZ7hQwCWsRmlZz5JFo"},
  FibaroWallPlugCooler = {deviceId = 10, property = "power", assetId = "YJEzdAdmukxgvywYDZwSjKoh"},
  FibaroWallPlugBrenner = {deviceId = 15, property = "power", assetId = "8Kb51Airyh4nZ7Cweqjv2TUf"},
  FibaroWallPlugWoZi = {deviceId = 8, property = "power", assetId = "oAWMs4DFAOOLBJuomlTnaoLM"},
--Global =     {VarName = "GlobalName", property = "global", assetId = "xxxxxxxxxxxxxxxxxxxxxxxx"},
}

--====================================================
-------------------- Functions
--====================================================

local function log(str) if debug then fibaro:debug(str); end; end
local function errorlog(str) fibaro:debug("<font color='red'>"..str.."</font>"); end

local function sendData (assetId, requestBody)
  local deviceToken = "maker:xxxxxxxxx"      -- Replace maker:xxxxxxxxx with your Device Authentication Token
  local url = "https://api.allthingstalk.io/asset/" .. assetId .. "/state"
  local httpClient = net.HTTPClient({timeout=5000})
 
  local httpHeaders =
      {
        ["Authorization"] = "Bearer " .. deviceToken,
        ["Content-Type"] = "application/json",
      }
 
  httpClient:request(url, {
    options={
      headers = httpHeaders,
      data = requestBody,
      method = 'PUT',
      timeout = 5000,
      checkCertificate = false,
    },
    success = function(response)
      if (response.status >= 200 and response.status < 300) then
        log(assetId .. ": " .. response.status .. " - successful")
      else
        errorlog(assetId .. ": " .. "ERROR")
      end
    end,
    error = function(error)
      errorlog(assetId .. ": " .. "ERROR")
      log(error)
    end
  })
end

--====================================================
-------------------- Main
--====================================================

-- Send data to AllThingsTalk
-- --------------------------
local function main()

    local sourceTrigger = fibaro:getSourceTrigger()
    local requestData = {}

    log("---")
    log(os.date("%a %d %b") .. " | Trigger: ".. sourceTrigger["type"] .. " | Name: " .. tostring(sourceTrigger['name']) .. " | Id: " .. tostring(sourceTrigger.deviceID))

    -- Check each device and format the request data
    for i, device in pairs(devices) do

        --check source trigger
        local trigger
        if sourceTrigger.deviceID ~= nil then
            trigger = sourceTrigger.deviceID
        elseif sourceTrigger["type"] == "global" then
            trigger = sourceTrigger['name']
        end
      
        --only triggered device/global. All devices if trigger by manual, from other scene or by timer
        if device.deviceId == trigger or device.property == trigger
        or sourceTrigger["type"] == "other" or OnlyTriggerDev == false then
      
            --check if power or value
            local valueId
            if device.deviceId <= 15 then
                valueId = tonumber(fibaro:getValue(device.deviceId, "power")) --power
            elseif device.deviceId > 15 then
                valueId = tonumber(fibaro:getValue(device.deviceId, "value")) --value
            end
            
            requestData = {value = valueId, at = currentDateISO}
            local requestBody = json.encode(requestData)
       
            --check value
            if valueId ~= nil then
                log(i .. ": " .. requestBody)
                sendData(device.assetId, requestBody) -- Send the data
            else
                errorlog(i .. ": " .. requestBody)
            end
        
        end

    end

    --check trigger
      local setTimer
    if TriggerByTimer == true then
          --if OnlyTriggerDev == false and sourceTrigger["type"] == "property" then setTimer = true end
        if sourceTrigger["type"] == "other" or sourceTrigger["type"] == "autostart" then setTimer = true end
    end
      --timer restart
    if setTimer then
          setTimeout(main, TimerValue*60*1000) --Restart mainloop
        log("Set timer " .. TimerValue .. " minutes")
      end

end

--mainloop
main()

Wahrscheinlich gehts noch einfacher und eleganter, aber bei mir läufts gut … :wink:

Viele Grüße

Hallo @AxelR, cool dass es nun klappt. Aber funktioniert der Triggerblock wirklich so wie Du ihn hast? Muss nicht hinter jeder ID die Eigenschaft stehen? Bei mir sieht es z.B. so aus:

--[[
%% autostart
%% properties
256 value
254 value
68 value
73 value
71 value
69 value
261 power
262 power
%% events
%% globals
SchPumpDurch
SchPumpLaufzeit
SolarPumpeMaxTag
BrennerLaufzMaxTag
--]]

Hier Triggert jede eingetragene Eigenschaft des Gerätes oder Globale das Script. Das GlobalName kannst Du Dir sparen wenn Du keine Globale mit diesem Namen hast. War nur als Beispiel gedacht.

Grüße…

Moin,

habe den Triggerblock modifiziert. Dadurch ändert sich aber bei meiner Datenerfassung nichts. Vllt. ordnen sich ja wirklich die ID einer nachfolgenden Eigenschaft zu …

Viele Grüße und vielen Dank…

Naben zusammen,
ich komme nun endlich mal wieder mich um diese Thema zu kümmern
@AxelR: wie realisierst Du denn das Schreiben von Werten bei Dir in einer Datei im Heimnetz?

Danke vorab
Gruß
Rik

Danke, „checkCertificate = false“ hat auch mein problem behoben

Moin zusammen!

Ich wollte heute mal wieder - mal ich etwas Zeit habe - mir meine übertragenen Werte anschauen, und neue loggen lassen. Leider musste ich feststellen, dass seit sechs Monaten keine Daten mehr übertragen wurden.
Hat sich bei der Anmeldung bei Allthinkstalk etwas verändert? Ich bekomme bei allen Devices eine Fehlermeldung…

Danke für Eure Hilfe!

Gruß
Rik

für den Fall das noch jemand das Selbe Problem hat: meins konnte ich hierdurch wieder anpassen:

Allerdings musste ich auch einen neuen Ground Token auf AllThingsTalk generieren…