Funktionen oder globale Variablen

Hallo HC2-Freunde,
ich bin vor Kurzem von Openhab auf den HC2 umgestiegen und bin sehr zufrieden. Allerdings habe ich folgende grundsätzliche Fragen:

  1. Verwendet ihr z.B. für bestimmte Lichtszenen
    a.) jeweils einzelne Szenen? (könnte unübersichtlich werden)
    b.) jeweils eine Funktion innerhalb einer großen Szene? (z.B. function “Licht_GuteNacht” oder “Licht_GutenMorgen” oder “Licht_Heimkino”, etc.)
    c.) eine große IF…elseif…end Abfrage die durch eine globale Variable gesteuert wird? (z.B. Globale Variable “LichtSzene” auf “GuteNacht” oder “GutenMorgen” oder “Heimkino”, etc.)

Als Semi-Programmierer fällt mit der Ansatz mit den globalen Variablen etwas schwer, da ich es gewohnt bin bestimmte Szenarien per function aufzurufen.
Wer kann mir den sinnvollsten Ansatz im HC2-Lua Umfeld schildern?

  1. Wenn ihr viele Szenen habt, wir organisiert ihr die Szenen?
    a.) z.b. per Namenskonvention immer mit “Licht_” am Anfang? (z.B. Licht_Szene_1, Licht_Szene_2, Licht_Bad…, Licht_Abendstimmung, …)
    b.) Bleiben die Szenen “nicht zugeordnet” oder nutz ihr die Räume oder habt ihr Dummy-Räume?

  2. Vergebt ihr bestimmte Namenspräfixe für globale Variablen wie z.B. “pubGarantorStatus” oder ist es unnötig, da man sowieso per “setGlobal” auf die Variable zugreift?

Fragen - Fragen - Fragen - ich möchte von Anfang an, die Sache durchdacht angehen, damit ich später nicht nochmal etwas umstellen muss.

Danke schon mal.
Karl Heinz aus Cuxhaven

Hallo Karl Heinz,

Willkommen in der Fibaro Welt!

Ich habe vor ca. 1 Jahr angefangen und mir auch , so wie du, gewisse Fragen gestellt. Das Ergebnis heute ist etwas Erfahrung was Sinn macht oder nicht :wink:
Allerdings kann man deine Fragen nicht so global beantworten!

1.) Was die Lichtszenen betrifft, haben ich bis jetzt nur wenige. Oft haben die Szenen einen Grund und daher nenne ich sie auch so. z.B. Licht im Untergeschoß aus.
Jeder Raum hat eine generelle “AUS” Szene und die Szene “Unten AUS” ruft diese Raumszenen auf. Damit kann ich in den Szenen der Räume was anpassen und das übergeordnete Skript funktioniert immer noch. z.B. wenn neue Lichter oder Steuerungen in einen Raum kommen.

2.) Bei den Namen bin ich eher flexibel. Die Szenen heißen meist so wie das was sie tun. Ich vergebe ähnlichen Szenen gleiche Icons, damit sind sie leichter zu identifizieren.

3.) Auch die globalen Variablen heißen bei mir so, wie die Funktion. z.B “PresentState” oder “LockState”

Du kannst dir deine Struktur noch so toll ausdenken, je nach dem wo sich deine Anlage hin entwickelt wirst du sichr noch manchmal Änderungen machen müssen :wink:

Tipp zur Benennung deiner Module: Bei mir hat es sich bewährt, die IDs der Module in den Namen aufzunehmen und diese SOFORT mit der ID Nummer zu beschriften.
DAS erspart dir viel Sucharbeit …

Hallo pblacky, Danke für die ausführlichen Antworten.

Wenn ich Dich richtig verstehe, dann steuerst Du z.B. die Licht-Szenen nicht per globaler Variable sondern per Aufruf der Szene per fibaro:startScene?
Die globalen Variablen scheinen in dem Fibaro-Konzept eine große Bedeutung zu haben, um damit Szenen per Zuweisung von Werten (an die globalen Variablen) zu steuern.
Schöne Grüße
Karl Heinz

Das mit den globalen Variablen für Szenen macht meiner Meinung nur bei Zuständen Sinn, die Einfluß auf mehrere Komponenten haben!
z.B. eine Variable für “Anwesend” oder “Abwesend”, oder für Push Nachrichten, die das System aus mehreren Skripten verschickt.

Für einzelne Lichtsteuerungen, die nur aus einer Szene kommen, braucht man meines Erachtens keine globalen Variablen.
Aber die Anlage ist extrem flexibel, daher gibt es sicher viele Wege zum Ziel. Hier liest du vorerst mal nur meine Meinung :wink:

Wahrscheinlich wird es ein Mix aus Variablen z.B. für Szenarien, die auch von anderen Zuständen ausgelöst werden (Bewegungsmelder, etc.) und Funktionen die nur innerhalb der “Gruppe” (Licht, etc.) aufgerufen werden. Sinnvoll ist sicher eine Liste der ID’s der Funktionen zu notieren ggf. im Namen der Szene zu vermerken, um schnell drauf zugreifen zu können. Danke für die Diskussion!

Schöne Grüße
Karl Heinz

Richtig!
Meine häufigsten Beleuchtungs Skripte sind auf NodeOn Fernbedienungen hinterlegt.
Hier ein Beispielskript dafür

Die entsprechenden Szenen trage ich dann so ein
fibaro:startScene(202) – AUS - ALLES

Hallo zusammen,

ich häng mich hier mal dran, da ich auch frisch in Lua eingestiegen bin. Hoffe das ist ok. Passt vom Beitragsnamen…

Ich will einen Wert in einer Szene “merken”. Wenn die Szene wieder ausgeführt wird, möchte ich den Wert auslesen und ggf. aktualisieren. Stichwort Globale Variable.
Hab jetzt viel gesucht und Scripte studiert und auch selbst eines zum Probieren erstellt, welches auch funktioniert. Bin mir nur unsicher ob es so gemacht wird:

Zuerst in der HC2-Variablen Steuerung eine globale Variable definieren. Dann per Lua darauf zugreifen:

--[[
%% properties
6 power
%% events
%% globals
--]]

fibaro:debug (fibaro:getValue(6, "power"));
fibaro:debug (fibaro:getGlobalValue("Zaehler"));
fibaro:setGlobal("Zaehler", tonumber(fibaro:getGlobalValue("Zaehler")) + 1);

Ist das vom Prinzip her korrekt oder zu umständlich? Wie macht man es sonst?

Aktuell möchte ich zählen wie oft eine Pumpe pro Tag anläuft und ggf. ne Pushnachricht verschicken. Über eine Rückmeldung würde ich mich freuen.

Grüße, Ändy

Hallo Ändy,
meiner Meinung nach ist die Vorgehensweise korrekt. Ich denke das Konzept von fibaro nutzt genau für sowas die globalen Variablen. Allerdings habe ich noch nicht festgestellt / getestet, ob die Werte auch einem Neustart erhalten bleiben.

Weiterhin glaube ich nicht, dass Du den Wert nochmals mit tonumber wandeln musst, da ich davon ausgehe, dass der gelieferte Wert vom Stromzähler numerisch ist.

Schönen Sonntag noch!
Karl Heinz

Hallo Karl Heinz,

danke für deine Antwort.

ch denke das Konzept von fibaro nutzt genau für sowas die globalen Variablen. Allerdings habe ich noch nicht festgestellt / getestet, ob die Werte auch einem Neustart erhalten bleiben.

Neustart wäre interessant. Wenn die Vorgehensweise mit den globalen tatsächlich so richtig ist, sollte man sich in der Tat Gedanken über die Benennung machen. Könnte unübersichtlich werden. Vielleicht nicht verkehrt sich das im Header vom Script zu notieren.

Weiterhin glaube ich nicht, dass Du den Wert nochmals mit tonumber wandeln musst, da ich davon ausgehe, dass der gelieferte Wert vom Stromzähler numerisch ist.

Danke für dem Tipp. Kommt mir sicher noch öfter unter die Finger :slight_smile:

Grüße, Ändy

Hi,

nach einem Neustart bleiben die Werte in den GV erhalten.

VG Hoggle

Wenn der Wert aus einer globalen Variablen kommt, dann ist es grundsätzlich immer ein String. Von daher ist das tonumber bei Variablen immer erforderlich.

Gruß