Tasmota geflashed und mit neuer Oberfläche versehen.

Wie ich dieses neue HMI(Human-Machine Interaction) Device im Internet entdeckt habe und auch gesehen habe, dass man es mit Tasmota flashen kann, wurde es sofort bestellt.

  1. Schritt war das flashen mit tasmota. Ich dachte, das wird so einfach wie immer, doch habe ich da eine Kleinigkeit übersehen. Dank eines wirklich gut gemachten YouTube Videos (Daumen hoch), waren die Schritte ganz einfach durchzuführen und trotzdem hat es nicht funktioniert. Das Problem war mein flash Programm. Es hat zwar tasmota drauf gespielt und auch gesagt, dass alles in Ordnung ist, aber das stimmte nicht. Mit dem im Video angegeben ESP Flasher war dann aber alles ok. Die Fehlersuche hat mir wieder einige Stunden und Nerven gekostet und einige graue Haare mehr beschert.
  2. Das Konfigurieren auf der tasmota Seite gut beschrieben und Dank blakkadder kann man auch gleich einmal mittels MQTT einige Veränderungen am Erscheinungsbild durchführen. Das ist ja gerade das tolle. Man benötigt keine Verbindung in die Cloud, sondern kann alles in seinem eigenen Netzwerk behalten, perfekt.
  3. Einmal Lunte gerochen, möchte man natürlich mehr. Auf der Suche bin ich auf den Eintrag von Mike im openHAB Forum gestoßen. Er hat eine neue modifizierte Software geschrieben (NXPanel), die noch mehr Möglichkeiten bietet. Also wurde kurzerhand diese auf das Device geladen. Hier noch der link auf seine github Seite.
  4. Es war nicht ganz so einfach aus der openHAB Diskussion die richtigen Schritte raus zu lesen. Nachdem ich meine OH Konfiguration über files steuere, war es auch notwendig die Informationen in diese Richtung anzupassen. Hier das Wichtigste zusammengefasst:
    • MQTT Channels anlegen (Trigger)
    • eine Rule die alles steuert
  5. Wie funktioniert das Ganze. Jedes Mal, wenn man etwas auf dem Bildschirm des NSPanel macht, schickt dieses eine MQTT Meldung, die über den Trigger die rule ausführt. In dieser rule wird dann auf das event reagiert und die entsprechenden Kommandos abgesetzt.
    Das Erste was man also braucht, ist die Aktion, die den Trigger ausgelöst hat. Das steht immer ganz vorne in der Nachricht. z.B. {„page“: {„format“: 5, „pid“: 101, „type“: „refresh“}}. Diese Aktionen können sein. „init“, „page“, „button“, „dimmer“, „therm“, „warning“, „playlist“ (und in Zukunft sicher noch mehr). Bei jeder Aktion gibt es weitere Parameter, die definieren, was am NSPanel gemacht wurde, bzw. was als nächster Schritt gemacht werden soll. Beim obigen Bsp. soll ein weiterer screen mit 6 Buttons („format“:6) geöffnet werden, der die page ID 101 bekommt („pid“:101″). Um den Screen neu darzustellen dient der Parameter „type“:“refresh“.
    Jetzt muss in der rule diese Aktion abgefragt und die richtigen Befehle abgesetzt werden. Also zuerst einmal herausfinden für welche page-ID und dann was zu tun ist. Anschließend das Kommando abschicken.
    Die Kommandos, die an das NSPanel per MQTT geschickt werden, hängen natürlich davon ab, was am screen zu sehen ist. Bei einem Button sind es andere als bei einem Dimmer. Eine Zusammenfassung weiter unten.
Thing topic sonoffNSPanel {  
 Channels:
  Type string : NXPsend 
  [commandTopic="cmnd/MQTT_name/nxpanel"] 
  Type string : NXPresult
  [stateTopic="tele/MQTT_name/RESULT"] 
  Type trigger : NXPtrigger 
  [stateTopic="tele/MQTT_name/RESULT", trigger=true ] 
}

rule "NXPanel"
when
 Channel "mqtt:topic:mosquitto:sonoffNSPanel:NXPtrigger" triggered 
then
 var m_action = NXPresult.state.toString.substring(2)
 var m_pos = m_action.indexOf("\"")
 m_action = m_action.substring(0,m_pos)   
 switch(m_action) {
  case "page":
   m_pid = transform("JSONPATH", "$.page.pid", NXPresult.state.toString)
   m_format = transform("JSONPATH", "$.page.format", NXPresult.state.toString)
   switch(m_pid){
    case "101":{
     m_command = '{"refresh":{"pid":101,"name":"Lounge","format":6,buttons:['
     m_command = m_command + '{"bid":1,"label":"Schalter","type":1,"state":1,"icon":1}, ' ....
     NXPsend.sendCommand(m_command)
  case "button":
  ...
 }
end

Da die ganze NXPanel Software noch in der Entwicklung ist, gibt es natürlich noch Kleinigkeiten, die nicht funktionieren. Daher ist es praktisch, wenn man die Befehle, die man an das NSPanel schickt mitprotokolliert, z.B. in Form von log Einträgen. Ich wollte diese Einträge in ein eigenes Log-file schreiben. Dafür muss man in der /var/lib/openhab/etc/log4j2.xml folgende Änderungen vornehmen.

<Appenders>
...
    <RollingRandomAccessFile fileName="${sys:openhab.logdir}/nxpanel.log" filePattern="${sys:openhab.logdir}/nxpanel.log.%i" name="NXPANEL">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n"/>
        <RegexFilter  onMatch="ACCEPT" onMismatch="DENY" regex=".*(nxpanel).*"/>
        <Policies>
            <OnStartupTriggeringPolicy/>
            <SizeBasedTriggeringPolicy size="16 MB"/>
        </Policies>
    </RollingRandomAccessFile>
...
</Appenders>

<Loggers>
...
 <Logger additivity="false" level="DEBUG" name="org.openhab.core.model.script.nxpanel">
    <AppenderRef ref="NXPANEL"/>
 </Logger>
...
</Loggers>

Jetzt kann man in der rule über den log Befehl die Information in ein eigenes log-file schreiben.

logDebug("nxpanel PAGE pid:{}, Type:{}, Command: {}", m_pid, m_type, m_command)

Natürlich darf man nicht vergessen für die NXPanel das logging aug DEBUG zu setzten. Dafür startet man die OH Konsole und setzt dort den Befehl ab.

#starte Konsole
sudo openhab-cli console

# zeigt loglevel an
openhab> log:list

# set log level to DEBUG
openhab> log:set debug org.openhab.core.model.script.nxpanel

Was natürlich auch cool ist, man kann die Einstiegsseite ebenfalls über MQTT beeinflussen. Ich zeige hier an, ob eine Tür offen oder geschlossen ist, das aktuelle Wetter aus OpenWeatherMap und auch die Temperatur aus dem Garten. Damit die richtige Zeit angezeigt wird, am besten die Standortdaten über die tasmota Konsole eingeben.

cmnd/MQTT_name/Longitude 16.322		# Breitengrad
cmnd/MQTT_name/Latitude 48.168		# Längengrad
// nimmt Sommerzeiteinstellungen von
cmnd/d1mini/Timezone 99
// Sommerzeit am letzten Sonntag im März um 2 Uhr
cmnd/d1mini/TimeDst 0,0,3,1,2,120
// Normalzeit am letzten Sonntag im Okt. um 3 Uhr	
cmnd/d1mini/TimeStd 0,0,10,1,3,60

image

{"start": {"pid": x, "format":x (1-15)}}
{"favorite": {"pid": x, "format":x (1-15)}}
{"dim": {"low":n, "normal":n}}
{"notifications": {"text": x, [or] "reset":1}}
{"weather": {"temp":x, "summary":x, "feels":x, "icon":x (openweather list)}}

// clock and switches called by tasmotoa
{"clock": {"date":x, "hour":x, "min":x, "month":x, "weekday":x}} 
{"switches": {"switch1":x, "switch2": x}} 
{"summary": {"title":x, "temp":x, [or] "text":x}}
{"warnings": [{"id":x (1-4) , "type":x (0-7) , "state":x (1-3)]},...]}}

# Mitte rechts
{"warnings": [{"id":1,"type":2,"state":"1"}]}

# links unten
{"weather": {"temp": 7, "icon": "04n", "feels": 4}} 
# rechts unten		
{"summary": {"temp": 7, "text": "Humidity 81%"}} 		

# links oben
{"notifications": {"text": "Door open"}}
# Favorite (Stern) Mitte unten				
{"favorite": {"pid": 10, "format":6)}}	
# swipe right to left			
{"start": {"pid": 13, "format":8)}}				

Kommandos:

  • page
    • sync: ‚{„sync“:{„pid“:‘ + m_pid + ‚,“format“:‘ + m_format + ‚}}‘
      • refresh:
        • Page with Buttons (2,4,6,8) : {„refresh“:{„pid“:10,“name“:“Lounge“,“format“:6,“buttons“:[{„bid“:1,“label“:“S ON“,“type“:1,“state“:1,“icon“:1},
          {„bid“:2,“label“:“S OFF“,“type“:1,“state“:0,“icon“:1},
          {„bid“:3,“label“:“Push“,“type“:2,“icon“:6}, {„bid“:4,“label“:“Bedroom“,“type“:10,“next“:101,“state“:5,“icon“:5}, {„bid“:5,“label“:“Temp“,“type“:10,“next“:102,“state“:9,“icon“:9}, {„bid“:6,“label“:“Info“,“type“:10,“next“:103, „state“:15,“icon“:16}, {„bid“:7,“label“:“Dimmer“,“type“:10,“next“:13,“state“:8,“icon“:2}, {„bid“:8,“label“:“Status“,“type“:10,“next“:17,“state“:15,“icon“:16}]}
      • Color Dimmer: ‚{„refresh“:{„pid“:13,“name“:“Dimmer2″,“format“:8,“power“:‘ + m_power + ‚,“hsbcolor“:“‚ + m_hsbcolor + ‚“}}‘
      • Thermostat: ‚{„refresh“:{„pid“:102,“name“:“Thermostat“,“format“:9}}‘
      • Status: ‚{„refresh“:{„pid“:103,“name“:“Info Page“, „status“:[{„id“:1,“text“:“Feld1″,“value“:“Wert“ ,“icon“: 1}]}}‘
  • button: {„refresh“:{„pid“:‘ + m_pid + ‚,buttons:[{„bid“:‘ + m_bid + ‚,“state“:‘ + m_state + ‚}]}‘
  • dimmer: DimmerItem.sendCommand(ON)
    DimmerItem.sendCommand( m_ct )
    DimmerItem.sendCommand( m_hsbcolor )
  • therm: {„refresh“:{„pid“:‘ + m_pid + ‚,“temp“:‘ + m_temp + ‚, „set“:‘ + m_set + ‚, „state“:‘ + m_state + ‚, „heat“:‘ + m_heat + ‚}}‘ // must be refresh, no sync
  1. Jürgen says:

    Hallo,
    tolle Erklärung der Grundfunktionen in deutscher Sprache. Ich bin zwar in der Lage englischen Text zu verstehen, aber es ist für mich doch anstrengender, besonders, wenn ich mich selbst an der Diskussion beteiligen möchte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Begin typing your search above and press return to search. Press Esc to cancel.