InitialState und FIBARO gemeinsam nutzen

Fibaro Initial State Plugin – Wie es funktioniert, was ist machbar?

Vorwort – Initial State

Vor einiger Zeit hat Initial State ( https://www.initialstate.com ) begonnen, für deren Lösung für die IoT freie Berichtsplattform zu werben. Soweit okay, viele Leute haben angefangen es zu nutzen, jedoch vor kurzen hat Initial State erkannt „lasst uns eine Ebene höher gehen“ und hat angefangen die Nutzung zu berechnen. Alle, die bereits einen Account besitzen, einen so genannten „Legacy Account“, können diesen weiterhin kostenlos nutzen. Andere müssen zahlen. Die kleinste Lösung auf der Initial State Website ist der „individuelle Account“ für 99 USD/Monat, also teure Angelegenheit. Ok, wenn man ein Tektronix Oszilloskop (ja, InitialState kann auch Tektronix Messgeräte auslesen) für 5-80k USD gekauft hat, kein Problem, aber das ist viel zu viel für die typische IoT Anwendung.

Allerdings hat Initial State in deren FAQ etwas über deren Abonnement-Codes erwähnt:

https://support.initialstate.com/hc/en-us/articles/360004222572-Using-Subscription-Codes

Es sah nicht danach aus, als könnte wirklich jemand ein „Gutschein“ von InitialState erhalten, aber ich lag falsch. Man kann diese „Gutscheine“ über Digikey oder Newark (nicht über Farnell) kaufen, für z.B. 1 Jahr für ca. 60 USD.

https://www.digikey.com/product-detail/en/initial-state-technologies-inc/21-10008/21-10008-ND/6173876
http://www.newark.com/initial-state/83-17170/initial-state-1-year-cloud-subscription/dp/31AC4874

Das macht 5 USD/Monat, was in meinen Augen okay ist, für solch ein universelles Berichtstool:

https://support.initialstate.com/hc/en-us/categories/360000176032-Data-Sources

Fibaro scheint über REST Echtzeit-Streaming zu nutzen, aber selbstverständlich kann man jede beliebige Quelle zum Bericht eingeben, selbst eine einzelne http-Aufforderung reicht aus und die Daten werden direkt auf der Initial State Seite angezeigt.

Bevor man es kauft, macht es Sinn sich zuvor einen Account zu erstellen und einen 14-tägigen kostenlosen Test zu machen, um herauszufinden, ob es das ist wonach man sucht.

Falls man es nicht mochte sollte man allerdings nicht vergessen, auf die Einstellungsseite des Initial State Accounts zu gehen und unter den Sicherheitseinstellungen auf „meinen Account schließen“ zu klicken.

Falls es in Ihrem Account keine Kreditkarte-Information gibt, wird InitialStates Ihnen keine 1180 USD/Jahr berechnen können, außer Sie wohnen in Tennessee (lokale Gesetzesvollstreckung).

Achtung: Sobald Sie Ihren Account geschlossen haben und es wieder später nutzen möchten, müssen Sie zuerst den InitialState Support kontaktieren.

Fibaro Plugin – Basics

Seit 4.504 ist das Plugin unter dem Bereich „Andere“ verfügbar:

image.png.29911d226d999996f0f812fd27c3f570.png

Installieren Sie es einfach, indem Sie auf „Installieren“ klicken, -> „Frei“ und fügen Sie dann Instanzen hinzu, indem Sie auf „Hinzufügen“ klicken. Anschließend müssen ein paar Einstellungen vorgenommen werden, gehen Sie dafür auf die Erweiterte Seite des Plugins:

image.png.5010131c1cc15833920aecbb07883289.png

Alle benötigten Informationen muss man erst auf der InitialState Website generieren lassen, die Vorgehensweise ist simpel: Konto anlegen, einloggen und schon landet man auf der „App“ Website.
Danach muss ein so genannter „Stream Bucket“ angelegt werden, dazu einfach das Cloud / Plus Symbol anklicken:

image.png.534c4ec15935f1874b8b6f981e00e58a.png

Es erscheint ein Dialog, in dem erstmal nur der Name des „Stream Buckets“ vergeben werden muss, danach einfach abspeichern.

image.png.5de467752385c5634298f23fcac2add9.png

Nach dem Abspeichern einfach Einstellungen den „Stream Buckets“ öffnen, da finden Sie alle für den Fibaro Plugin benötigten Informationen:

image.png.b04cea0de394021e68142a2a7a777e39.png

Die müssen dann noch in den Plugin rein …

image.png.4764d9a758e065e59de03e164a0f14c2.png

Die anderen Einstellungen stehen standardmäßig etwas ungünstig, was man damit alles machen kann beschreibe ich später,

image.png.832ce70918994badd58d2ab9978bb57f.png

vorerst suchen Sie nach irgendeinem z.b. Lichtschalter, ich habe mein Bad, und der Dimmer Oberlicht gewählt:

image.png.bff67505c1a90e91248db279dedad7e5.png

Jetzt können Sie auf Speichern klicken, und schon werden die Daten Richtung InitialState geschoben.
Der Plugin erlabt natürlich mehrere Quellen, einfach selektieren und erneut abspeichern, schon erscheinen mehrere Einträge in der Liste.
Unerwünschte können natürlich ebenfalls gelöscht werden.

Jetzt können Sie bereit auf der InitialState Website die Änderungen beobachten, am einfachsten in dem „Tiles“ Bereich …

image.png.9fbf97ca2e5eb8d30a8ff4cc56317434.png

image.png.e22ad04a41c4f562f0ad0ee8d1eabd8d.png

… natürlich muss die selektierten Quellen auch erst den Status ändern, in meinem Fall haben das Licht im Bad eingeschaltet und schon zeigt InitialState die Änderung

image.png.b7fdfa14f59c3b902c10ff4c8dcda9d3.png

Um die Werte im raw Format, also so wie die bei InitialState ankommen, zu beobachten wechseln Sie auf das letzte Icon „raw data“

image.png.a5d03ff5cee4b0757f052f7496179ee3.png

Die anderen Icons/Tabs bieten Vielzahl von Möglichkeiten, die diesen Artikel sprengen würden. Alle Informationen finden Sie unter:
https://support.initialstate.com/hc/en-us/categories/360000428291-Using-Initial-State

Für Smart Home Nutzung sind viele Szenarien interessant, ob die Position der Sonne vs. Lichtstärke im Wohnzimmer vs. Temperatur.
Aber auch Sachen wie Anwesenheitsprüfung anhand der WLAN Stärke mobile Geräte auf dem WLAN Unifi Access Point:

image.png.9f3bb6662d4dc7a1b9a25fc6c38f871a.png

Alle gespeicherten Daten können sowohl exportiert, als auch erneut importiert werden:

image.png.0a51eff66c11eac5bc6dc807ce858535.pngFibaro Initial State plugin – “Rules” Beschreibung

Der Plugin bietet eine Vielzahl von Filtern / Richtlinien, leider ist die Dokumentation nicht existent, daher versuche ich so einfach wie möglich die zu erklären:

image.png.832ce70918994badd58d2ab9978bb57f.png

Select room – das sind alle Räume im Fibaro

Select type – das sind alle installierte Gerätetypen auf Ihrer HC2, was natürlich bedeutet die Ansicht variiert je nach dem was tatsächlich vorhanden ist (VDs, Plugins, Z-Wave Geräte, Benutzer, mobile Geräte).

Was für Gerätetypen auf Ihrer HC2 installieret sind, können Sie mit einfacher Lua Szene prüfen (wobei der Plugin wird mehr anzeigen als die Szene, das liegt an den Zugriffsrechten auf der HC2)

local devices = api.get('/devices')
for k,v in pairs(devices) do
for k2,v2 in pairs(v) do
if k2 == "type" then
print(v2)
end
end
end

Hack-Tipp -> Was so alles eine HC2 kann, findet man aber auch in dem entpackten HC2 Firmware Dateien, unter /opt/fibaro/types

Select interface – das sind alle Schnittstellen der installierten Gerätetypen auf Ihrer HC2 (Batteriebetrieben, Z-Wave, etc.)

Was für Schnittstellen auf Ihrer HC2 installiert sind, können Sie mit einfacher Lua Szene prüfen (wobei der Plugin wird mehr anzeigen als die Szene, das liegt an den Zugriffsrechten auf der HC2)

local devices = api.get('/devices')
for _,dev in pairs(devices) do
if(dev.interfaces ~= nil) then
for __,v in pairs(dev.interfaces) do
print(v)
end
end
end

Hack-Tipp -> Was so alles eine HC2 kann, findet man aber auch in dem entpackten HC2 Firmware Dateien, unter /opt/fibaro/interfaces

Select device – das sind natürlich alle Geräte auf Ihrer HC2, also in LUA:

api.get('/devices')

Select property – das sind natürlich alle „auswählbare“ Eigenschaften der installierten Geräte.

Was für Eigenschaften die auswählbare Gerte auf Ihrer HC2 vorhanden sind, können Sie mit einfacher Lua Szene prüfen (wobei der Plugin wird mehr anzeigen als die Szene, das liegt an den Zugriffsrechten auf der HC2)


local apiDevicesList = api.get('/devices')
for _,dev in pairs(apiDevicesList) do
for k2,v2 in pairs(dev.properties) do
if type(v2) ~= 'table' and not string.match(k2, '^ui%.')then
print(k2)
end
end
end

Da alle hier anzeigten LUA Beispiele aus den Plugin Quellen stammen, können Sie eine Besonderheit sehen. Der Plugin filtert leider alle VD Elemente (Filter not ^ui%.) aus, so kann InitialState keine Änderung aus z.b. Labels einer VD zeigen:

image.png.1bd494cfccf7f080f5e5aa07b27bd3de.png

Die beiden Labels sehen als LUA Code tatsächlich so aus:

image.png.1422aa2e9ddecc49b0a8cdad7fb36dc8.png

Alle rot markierten Eigenschaften, in dem Beispiel die beiden Labels, werden einfach weggefiltert in dem Plugin. Schade.

Um dennoch den Plugin mit VD nutzen zu können, müssen Sie entweder die Werte von Schiebern, Buttons oder Labels in „log“ oder „logTemp“ Eigenschaft der VD schreiben und die dann in dem InitialState als Quelle wählen. Dies ist gut für1-2 Labels, aber es geht auch anders.

Sie können direkt eine LUA Szene nehmen, die dann die Werten direkt schreibt:


--[[
%% properties
%% globals
--]]

-- only one instance allowed

if (fibaro:countScenes() > 1) then
fibaro:abort()
end

-- initialstate account informatons

-- please specify the login data below

local streamingAccessKey = "12345"
local bucketKey = "12345"

-- the name of the datapoint
local datakey = "VDLabel1"

-- change to the label you wish to read and show on initialstate

local mylabeltoread = fibaro:getValue(522, "ui.Label1.value")

------------------------------

-- do not change code below --

------------------------------

local headers = {}
headers['Content-Type'] = 'application/json'
headers['X-IS-AccessKey'] = streamingAccessKey
headers['X-IS-BucketKey'] = bucketKey

-- not sure if this is good idea, Fibaro is using in their plugin
-- but i think "Accept-Version: ~0" could be better

headers['Accept-Version'] = '0.0.1'

-- initialstate URL
local posturl = 'https://groker.initialstate.com/api/events'

-- main function
function showVDLabelOnInitialState()

local event = {}
-- let's use local time
event["epoch"] = os.time()
event["key"] = datakey
event["value"] = mylabeltoread

local bucket = {}
table.insert(bucket, event)

if (tostring(json.encode(bucket)) ~= "{}") then
--send bucket
isData = net.HTTPClient({timeout = 2000})
isData:request(posturl, {
options = {
method = 'POST',
headers = headers,
data = json.encode(bucket),
},
success = function(param)
end,

error = function()

print("error")
-- no no, don't abort here, sometimes initialstate reports error, so let's not break loop
--fibaro:abort()
end
}
)
else

print('label without value? exiting now ...')
fibaro:abort()
end

-- loop every 1 minute
setTimeout(function() showVDLabelOnInitialState(); end, 1000 * 60)
end

fibaro:debug("loop started...")
showVDLabelOnInitialState()

InitialState wo ist die ISS?

Initial State bietet sehr viele Möglichkeiten, ein davon ist die Darstellung auf eine Karte. Mein Lieblingsbeispiel ist die ISS Tracker Szene, und die Visualisierung über Initial State:

image.thumb.png.4537092d2013a5e6b921871e99789838.png

Die Szene kann sowohl mit aber auch ohne InitialState Plugin genutzt werden, dann tragen sie bitte die benötigten Login-Informationen direkt in die Szene, statt in den Plugin.

Die ISS Tracker Szene braucht auf der Initial State Seite nur eine Voreinstellung, und zwar Sie brauchen eine Karte auf der die Koordinaten der ISS angezeigt werden.

Die erstellen Sie unter „Tiles“ und dann einfach den Typ als „Map“ wählen und signalquelle benennen (die muss natürlich denselben Namen tragen wie in der Szene)

image.png.7925f775bc612939fcf5312e19ca32c3.png

… und hier die Szene:

  • Falls nur eine Instanz des Initial State Plugins installiert wurde -> nichts muss geändert werden, die Szene wird alles für Sie übernehmen
  • Falls mehrere Instanzen installiert wurden -> Sie können diese weiterhin ohne irgendwelche Einstellungsänderungen in der Szene nutzen (die erste Instanz des Plugins wird ausgewählt), oder Sie können in der Szene „usePlugin=false“ festlegen und Ihre streamingAccessKey und bucketKey Daten angeben
  • Falls kein Initial State Plugin installiert wurde, müssen Sie Ihre streamingAccessKey und bucketKey Daten eingeben.

--[[
%% properties
%% globals
--]]

-- only one instance allowed
if (fibaro:countScenes() > 1) then
fibaro:abort()
end

-- if installed plugin has to be used, set it to true
local usePlugin = true

-- in case of more than one or no plugin installed
-- please specify the login data below
local streamingAccessKey = "12345"
local bucketKey = "12345"
-- the name of the datapoint
local isskey = "ISS Position"
-- set to true to see position data update in debug window
local debug = false

----------------------------------
-- do not change anything below --
----------------------------------

-- when using only one instance of Fibaro Initialstate Plugin
-- the login data can be set automatically
function getpluginID()
local devices = api.get('/devices')
for _, dev in ipairs(devices) do
if (dev.type == "com.fibaro.initialstate") then
return dev.id
end
end
end

-- do some logic to get data or warn user about wrong setup
local pluginID = getpluginID()
if (pluginID == nil) then
print('initialstate plugin not found, using manual data')
else
print('using plugin with ID '..pluginID)
end

if (usePlugin == true) then
if (pluginID == nil) then
print('initialstate plugin not found, please setup manual data, exiting now ...')
fibaro:abort()
else
streamingAccessKey = fibaro:getValue(pluginID, "streamingAccessKey")
bucketKey = fibaro:getValue(pluginID, "bucketKey")
end
else
if (bucketKey == "12345" or streamingAccessKey == "12345") then
print('without plugin or manual data this scene will not work, exiting now ...')
fibaro:abort()
end
end

local headers = {}
headers['Content-Type'] = 'application/json'
headers['X-IS-AccessKey'] = streamingAccessKey
headers['X-IS-BucketKey'] = bucketKey
-- not sure if this is good idea, Fibaro is using in their plugin
-- but i think "Accept-Version: ~0" could be better
headers['Accept-Version'] = '0.0.1'

-- ISS URL
local geturl = 'http://api.open-notify.org/iss-now.json'
-- initialstate URL
local posturl = 'https://groker.initialstate.com/api/events'

-- main function
function showISSOnInitialState()
-- get data
issData = net.HTTPClient({timeout = 5000})
issData:request(geturl, {
success = function(response)
if response.status == 200 then
if response.data and response.data ~= "" then
local lo = json.decode(response.data)['iss_position']['longitude']
local la = json.decode(response.data)['iss_position']['latitude']
local event = {}
-- let's use local time
event["epoch"] = os.time()
event["key"] = isskey
event["value"] = la..","..lo
local bucket = {}
table.insert(bucket, event)
if (tostring(json.encode(bucket)) ~= "{}") then
--send bucket
if (debug == true) then print(json.encode(bucket)) end
isData = net.HTTPClient({timeout = 2000})
isData:request(posturl, {
options = {
method = 'POST',
headers = headers,
data = json.encode(bucket),
},
success = function(param)
end,
error = function()
print("error")
-- no no, don't abort here, sometimes initialstate reports error, so let's not break loop
--fibaro:abort()
end
}
)
else
print('no data from ISS, aliens shot it? exiting now ...')
fibaro:abort()
end
end
end
end,
error = function()
print("error")
fibaro:abort()
end,
options = {
method = "GET"
}
}
)
-- loop every 1 minute
setTimeout(function() showISSOnInitialState(); end, 1000 * 60)
end

fibaro:debug("loop started...")
showISSOnInitialState()

Related Posts

Leave a Reply

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich akzeptiere