Switch2Toggle

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Neuroplant
Beiträge: 28
Registriert: 13. Jul 2018 10:09
Answers: 0

Switch2Toggle

Beitrag von Neuroplant »

Hallo,
Ich habe einen Westinghouse Deckenventilator(IR), den ich mit einer Logitech Harmony ansteuere.
Dieser Ventilator hat auch eine Lampe, für die es auch einen IR Befehl (LightToggle) gibt.

Ziel ist es nun die Lampe Alexa-Konform als "Switchable" einzubinden und den Ventilator als "Lighting" zu dimmen (auch wenn er eigendlich nur die vier Stufen "PowerOff", "FanLow", FanMed und "FanHigh" kennt.

my.items

Code: Alles auswählen

Switch SchlafzimmerDecke 	"Schlafzimmerlicht" 	<light> 	(gLights) 	["Switchable"]
Dimmer Vent_DIM 		"Ventilator" 		<fan_ceiling> 	(gDevices)	["Lighting"]
String VentilatorCom 	{harmonyhub="harmonyhub:device:HarmonyHub:47393679:buttonPress"}
my.rules

Code: Alles auswählen

rule "Schlafzimmer_Swich2Toogle"
when
	Item SchlafzimmerDecke changed 
then
	VentilatorCom.sendCommand( "LightToggle" )
end

rule "Ventilator_Dimming"

when 
	Item Vent_DIM changed 
then
	if ( Vent_DIM.state == 0 ) 				{VentilatorCom.sendCommand("PowerOff")}
	if ( Vent_DIM.state > 0 && Vent_DIM.state <= 33 ) 	{VentilatorComsendCommand("FanLow")}
	if ( Vent_DIM.state > 33 && Vent_DIM.state <= 66 ) 	{VentilatorCom.sendCommand("FanMed")}
	if ( Vent_DIM.state > 66 ) 				{VentilatorCom.sendCommand("FanHigh")}
end
a) Die Idee bei Rule "Schlafzimmer_Swich2Toogle" ist, dass 'Item SchlafzimmerDecke changed' immer nur feuert, wenn von ON nach OFF gewechselt wird, nicht aber bei zwei aufeinander folgenden "ON" oder zweimal "OFF", so dass aus dem Toggle ein Switch wird.

b) Die Idee bei "Ventilator_Dimming" ist die Dimmwerte 0..100 den verschiedenen Stufen des Ventilators zuzuordnen.

Problem a) : auch bei aufeinander folgenden "ON" Befehlen wird jedes mal geschaltet
Problem c) : wenn der Ventilator eingeschaltet wird startrt er immer mit 100%, nicht mit dem letzen Dimmwert.

Gruß
Neuroplant

hr3
Beiträge: 210
Registriert: 23. Mai 2017 21:41
Answers: 0

Re: Switch2Toggle

Beitrag von hr3 »

Problem a) : auch bei aufeinander folgenden "ON" Befehlen wird jedes mal geschaltet
sollte eigentlich funktionieren. Schau mal im log nach, wie die Satus-Änderung von SchlafzimmerDecke protokolliert wird. Möglicherweise funktioniert

Code: Alles auswählen

Item SchlafzimmerDecke changed from ON to OFF or
Item SchlafzimmerDecke changed from OFF to ON

Code: Alles auswählen

if ( Vent_DIM.state > 0 && Vent_DIM.state <= 33 ) 	{VentilatorComsendCommand("FanLow")}
Für diese Zeile hättest du vom Editor und im log einen Fehler bekommen müssen.
Welchen Editor verwendest du?

Code: Alles auswählen

rule "Ventilator_Dimming"
when 
    Item Vent_DIM changed 
then
    if      ((Vent_DIM.state as DecimalType).intValue > 66) {VentilatorCom.sendCommand("FanHigh")}
    else if ((Vent_DIM.state as DecimalType).intValue > 33) {VentilatorCom.sendCommand("FanMed")}
    else if ((Vent_DIM.state as DecimalType).intValue >  0) {VentilatorCom.sendCommand("FanLow")}
    else                                                    {VentilatorCom.sendCommand("PowerOff")}
end
Wenn der Ventilator nur diese Zustände kennt, würde ich ihn auch als Setpoint 0-3 oder Selection abbilden, hat aber erst mal nichts mit der Funktion der Rule zu tun.

Ich würde Selection direkt für VentilatorCom definieren und auf die anderen Items und die Rules verzichten.
Welche Anforderungen Alexa stellt, kann ich nicht sagen.

Neuroplant
Beiträge: 28
Registriert: 13. Jul 2018 10:09
Answers: 0

Re: Switch2Toggle

Beitrag von Neuroplant »

Hallo,
Werde mal deine Vorschläge übernehmen und dann nach Feierabend testen.
Editor ist VB Code /Notepad++, wenn du aber den fehlenden "." meinst, der ist eben offline entstanden, der ist im "original" nicht (hatte noch etwas umbenannt..)

Über eine Selection hatte ich es vorher gelöst, ist auch Okay auf dem Tablet (Habe ein altes Android-Tab an die Wand geschraubt) aber aus einem Gerät gleich vier Einzelne zu machen..
Setpoint gefällt mir, lässt sich das nur in Sitemaps verwenden, oder geht das auch als itemtype?
Oder hat das Vorhandensein in einer Sitemap Auswirkungen auf die Schritte durch Alexa? ("Alexa, Ventilator höher" erhöht dann denn Dimmwert um die Konstante step) das wäre perfekt.

Was bei meinem Problem b) helfen würde wäre an den vorvorletzten Wert (ähnlich wie "<item>.previousState()" auf den letzten Wert zugreift) zu kommen. (da "ON" auf 100% setzt, vorher "OFF" also 0% war hätte ich gerne den Wert davor wieder)
Gibt es da was? (nutze mysql)

Gruß
Neuroplant
PS: fehlen da nicht jede Menge geschweifte Klammern, oder kann man nach dem "else" darauf verzichten?

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Switch2Toggle

Beitrag von udo1toni »

Die geschweiften Klammern fassen mehrere Zeilen Code zu einer Gruppe zusammen. wenn ein Befehl sich auf einen anderen Befehl bezieht, wird immer nur ein Befehl als zugehörig betrachtet, es sei denn man gruppiert ihn:

Code: Alles auswählen

rule test
when
    Item blah reveived command
then
    if (test)
        foo 
    else
        bar
end
führt foo aus, falls test wahr ist, und bar falls test nicht wahr ist.

Code: Alles auswählen

rule test
when
    Item blah reveived command
then
    if (test){
        foo
        foo2
    }
    else 
        bar
        bar2
end
foo und foo2 werden nur ausgeführt, wenn test wahr ist,
bar wird nur ausgeführt, wenn test nicht wahr ist.
bar2 wird immer ausgeführt, und zwar nach foo2 oder bar. bar2 gehört also eigentlich auf die erste Ebene, nicht auf die zweite Ebene.

Zu a: Wie von hr3 erwähnt, sollte der Code eigentlich so funktionieren, wie von Dir geplant. Man müsste halt mal schauen, was das Log so über die Zustandsänderungen von SchlafzimmerDecke erzählt.
Zu b: vermutlich sendet Alexa hier zuerst einen ON-Befehl. Auch da hilft sicher ein Blick in das Log. Du kannst versuchen, den Trigger auf received command zu ändern. Dazu sorgst Du dafür, dass der Status von Vent_DIM nicht automatisch geändert wird. Das Schalten erfolgt über ein Number Item.

Code: Alles auswählen

Dimmer Vent_DIM "Ventilator" <fan_ceiling> (gDevices) ["Lighting"] {autoupdate="false"}
Number Vent_Level "Ventilator" <fan_ceiling> (gDevices)

Code: Alles auswählen

rule "Ventilator_Dimming"
when 
	Item Vent_DIM received command
then
    var Number ventLevel = Vent_Level.state as Number
    if(receivedCommand instanceof Number){                                 //der Befehl ist eine Zahl
        if ( receivedCommand == 0 )                          ventLevel = 0
        if ( receivedCommand > 0 && receivedCommand <= 33 )  ventLevel = 1
        if ( receivedCommand > 33 && receivedCommand <= 66 ) ventLevel = 2
        if ( receivedCommand > 66 )                          ventLevel = 3
     }
     else                                                                  // der Befehl kommt als Befehl
        switch receivedCommand {
            case INCREASE : {
                ventLevel += 1                                             // oder ventLevel = ventLevel + 1
                if (ventLevel > 3)  ventLevel = 3
            }
            case DECREASE : {
                ventLevel -= 1                                             // oder ventLevel = ventLevel - 1
                if (ventLevel < 0)  ventLevel = 0
            }
            case OFF :              ventLevel = 0
            case ON : {
                if (ventLevel == 0) ventLevel = 1
                else                ventLevel = 3
            }
        }
    if (ventLevel != (Vent_Level.state as Number)) {
        switch ventLevel {
            case 0 : VentilatorCom.sendCommand("PowerOff")
            case 1 : VentilatorCom.sendCommand("FanLow")
            case 2 : VentilatorCom.sendCommand("FanMed")
            case 3 : VentilatorCom.sendCommand("FanHigh")
        }
        Vent_Level.postUpdate(ventLevel)
        Vent_DIM.postUpdate(33 * ventLevel)
    }
end
Der Code sieht jetzt erheblich länger aus, was aber vor allem daran liegt, dass ich nicht weiß, was nun wirklich als Befehl von Alexa kommt (ich habe keines).
Die Rule deckt alle Möglichkeiten ab. Kommt eine Zahl als Befehl, wird die Ventilatorstufe entsprechend gesetzt. Kommen die Befehle ON/OFF/INCREASE/DECREASE wird die passende Stufe gesetzt. Im Fall von ON habe ich es so definiert, dass, falls der Ventilator aus war, er auf niedriger Stufe gestartet wird. Falls erneut ein ON-Befehl erfolgt, schaltet er direkt in die höchste Stufe.
Am ende der Rule wird der eigentliche Befehl gesendet.

Schau im Log nach, was Alexa als Befehl schickt. Falls nur die Befehle ON/OFF/INCREASE/DECREASE kommen, kannst Du den ersten Teil der Rule weg lassen. Ein Vent_DIM.postUpdate() ist dann auch nicht zwingend notwendig. Falls nur konkrete Zahlen kommen, kannst Du den mittleren Teil der Rule weg lassen.

PS: Die Ventilatorstufe als Zahl zwischen 0 und 3 abzubilden erleichtert das Errechnen der zu wählenden Stufe. Damit alles konsistent bleibt, sollte man dann auf der Sitemap als item Vent_Level mit einem Selection oder Switch Widget mit mapping verwenden (vier Schaltflächen sollten hin passen).

Code: Alles auswählen

Switch    item = Vent_Level mappings=[0="Off",1="Low",2="Med",3="High"]  // entweder oder
Selection item = Vent_Level mappings=[0="Off",1="Low",2="Med",3="High"]  // entweder oder
Zuletzt geändert von udo1toni am 23. Jul 2018 22:44, insgesamt 1-mal geändert.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Neuroplant
Beiträge: 28
Registriert: 13. Jul 2018 10:09
Answers: 0

Re: Switch2Toggle

Beitrag von Neuroplant »

Hallo,
Vielen Dank für die Antwort,
Ich habe leider nicht hinbekommen, dass ich eine Benachrichtigung per Mail bekomme (obwohl abgehakt)
Das Dimmer Problem habe ich ja nicht nur mit dem Ventilator, werde testen und berichten
Gruß
Neuroplant

hr3
Beiträge: 210
Registriert: 23. Mai 2017 21:41
Answers: 0

Re: Switch2Toggle

Beitrag von hr3 »

Ich habe leider nicht hinbekommen, dass ich eine Benachrichtigung per Mail bekomme
Entschuldigung, dass wir die die Lösungs dafür noch nicht presentiert haben, hätten wir bestimmt gern getan, wenn wir von den Problem auch nur geahnt hätten.
Viel interessanter ist im Moment, was mit dem ursprünglichen Problem ist, was hast du umgesetzt und mit welchem Ergebnis?

Neuroplant
Beiträge: 28
Registriert: 13. Jul 2018 10:09
Answers: 0

Re: Switch2Toggle

Beitrag von Neuroplant »

hr3 hat geschrieben: 22. Jul 2018 16:58
Ich habe leider nicht hinbekommen, dass ich eine Benachrichtigung per Mail bekomme
Entschuldigung, dass wir die die Lösungs dafür noch nicht presentiert haben, hätten wir bestimmt gern getan, wenn wir von den Problem auch nur geahnt hätten.
Viel interessanter ist im Moment, was mit dem ursprünglichen Problem ist, was hast du umgesetzt und mit welchem Ergebnis?
Ich wollte nur um Entschuldigung bitten, dafür, dass ich so schleppend reagiere und dies nicht an meiner Achtung eurer Bemühungen, mir zu helfen, liegt.

Derzeitiger Status? Ich bin auf dem Kriegsfuß mit der select / case Syntax meine Programmierkentnisse sind in den letzten 25 Jahren etwas eingerostet und ich weiß noch nicht mal welche Sprache hier verwendet wird..

Gruß
Neuroplant

hr3
Beiträge: 210
Registriert: 23. Mai 2017 21:41
Answers: 0

Re: Switch2Toggle

Beitrag von hr3 »


Neuroplant
Beiträge: 28
Registriert: 13. Jul 2018 10:09
Answers: 0

Re: Switch2Toggle

Beitrag von Neuroplant »

Zu Problem a) ist gelöst mit

Code: Alles auswählen

when
	Item SchlafzimmerDecke changed from ON to OFF or
	Item SchlafzimmerDecke changed from OFF to ON
Warum auch immer es nötig ist.

zu Problem b)

Code: Alles auswählen

rule "Ventilator_Dimming"
when 
	Item Vent_DIM received command 
then {
	if ( Vent_DIM.state == 0 )                          VentilatorCom.sendCommand("PowerOff")
        if ( Vent_DIM.state > 0 && receivedCommand <= 33 )  VentilatorCom.sendCommand("FanLow")
	if ( Vent_DIM.state > 33 && receivedCommand <= 66 ) VentilatorCom.sendCommand("FanMed")
        if ( Vent_DIM.state > 66 )                          VentilatorCom.sendCommand("FanHigh")
     }     
end

läuft sauber und ist Okay so.

Das Problem, das ich habe ist mit allen meinen Dimmern
Das Commando ON wird vom Dimmer als 100% umgesetzt, ich möchre aber den letzten Zustand vor dem Ausschalten.

evtl sollte etwas wie diese beiden Zeilen weiterhelfen

Code: Alles auswählen

		
	if ( Vent_DIM.state == 100 )	Vent_DIM.state = Vent_DIM.previousState()  // <item>.previousState()	Gets the previous State of a persisted Item (returns HistoricItem)
	if ( Vent_DIM.state != 0 )	Vent_DIM.persist("mysql")	// <item>.persist	Persists the current State of the Item
naja, die beiden Zeilen funktionieren so aber nicht.

Gruß
Neuroplant

Benutzeravatar
udo1toni
Beiträge: 15243
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Switch2Toggle

Beitrag von udo1toni »

Kannst Du den Dimmer nicht so konfigurieren, dass er auf den letzten Dimmwert geht? Ansonsten musst Du tatsächlich das Item persistieren (das geschieht aber automatisch oder garnicht, das heißt, Du musst den Persistence Service korrekt konfigurieren (im Fall von mysql als Persistence Service in einer Datei mysql.persist:

Code: Alles auswählen

// persistence strategies have a name and a definition and are referred to in the "Items" section

Strategies {
        everyMinute : "0 * * * * ?"
}

Items {
        Vent_DIM : strategy = everyChange
}
Der Name der .persist Datei muss zu eingesetzten Persistence passen, in diesem Fall also mysql. Ich gehe davon aus, dass die Persistence ansonsten schon funktioniert.

Du darfst die Rule nicht auf changed triggern lassen, es sei denn, Du willst niemals die Helligkeit 100 einstellen! Stattdessen verwendest Du received command ON als Trigger. previousState könnte in einer solchen Rule tatsächlich auch funktionieren, je nachdem, wie schnell die Rückmeldung vom Dimmer kommt. Das Problem ist nämlich, dass der vorige Zustand des Dimmers nicht die zuletzt gewählte Helligkeit ist, sondern der Zustand vor dem Einschalten, also normalerweise 0. Vermutlich musst Du entweder den Zeitpunkt des Ausschaltens oder den letzten Helligkeitswert ungleich 0 in einem eigenen Item speichern. Mir wäre jedenfalls so direkt kein weg bekannt, den vorletzten Helligkeitswert ungleich 0 aus der Persistence auszulesen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten