@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
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
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 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
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 …
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…