Sonoff B1 und MQTT in FHEM

Begonnen von andies, 05 Oktober 2017, 13:54:20

Vorheriges Thema - Nächstes Thema

andies

Hat von Euch schon jemand den Sonoff B1 in FHEM integrieren können? Flashen war möglich, ich kontrolliere das Gerät über eine interne IP, aber ich weiß nicht, wie man das FHEM einbinden könnte. Auch habe ich keine Hue, aus der ich das entnehmen könnte.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

#1
So, nun habe ich es hinbekommen. Es gibt mehrere Probleme und meine Lösung ist sicherlich anfängerhaft, aber gegeben die folgenden Schwierigkeiten will ich nicht mehr Arbeit als diese drei Tage, die ich nichts anderes gemacht habe, investieren:

  • MQTT kennt keinen Colorpicker.
  • Manchmal gibt der Sonoff nicht die Farbe zurück, die man übergeben hat.
  • Die Farbgebung des Sonoff B1 ist übersichtlich. Einen Raum kann man damit nicht ausleuchten.
  • Hinzu kommt, dass nicht nur die Farbe übergeben werden muss, sondern auch Farbtemperatur und Wärme gesetzt werden müssen. Setzt man dieser aber anders als 0000, schaltet der Sonoff sofort auf weißes Licht; die Farbe ist dann weg.

Ich bin daher wie folgt vorgegangen. Zuerst habe ich einen dummy definiert, der einen colorpicker zulässt. Dieser dummy löst bei Farbauswahl ein notify aus, das wiederum eine Webseite (nämlich genau die Seite des Sonoff B1) aufruft. Der Rückgabewert dieser Webseite enthält die Farbe, die der Sonoff am Ende für sich als möglich erachtete. Diese wird dann per perl in ein Reading des ursprünglichen dummy geschrieben. Ich wäre für Verbesserungsvorschläge sehr dankbar, wenn jemand das besser machen kann.

Hier der dummy:
defmod Sonoff_B1_Farbe dummy
attr Sonoff_B1_Farbe readingList Color Result
attr Sonoff_B1_Farbe setList Color:colorpicker,RGB

und das dazugehörige notify, <IP> ist dabei durch die IP des Sonoff B1 zu ersetzen:
defmod Sonoff_B1_Farbwechsler notify Sonoff_B1_Farbe:Color:.* {my $farbe = GetFileFromURL("http://<IP>/cm?cmnd=Color%20".ReadingsVal("Sonoff_B1_Farbe", "Color","000000")."0000", 2);; fhem ("setreading Sonoff_B1_Farbe Result ".substr($farbe,47,8))}
attr Sonoff_B1_Farbwechsler userReadings inhalt

Das mit dem Substr stimmt auch nicht so genau, weil insgesamt ein sehr langer String zurückgegeben wird (in etwa so RESULT = {"POWER":"on", "Dimmer":72, "Color":"B79C7E0000"}) und ich mit ~= /irgendwas/ nicht weiterkam. Egal.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

cawe

#2
Ich steuere auch drei Sonoff B1 mit FHEM an.

Als Firmware verwende ich Sonoff-Tasmota (in Version 5.8.0b).

Das Flashen der neuen (Fremd-)Firmware funktioniert übrigens drahtlos ohne Öffnen der B1 und ohne Anlöten von Drähten. Wie das geht ist unter
https://github.com/mirko/SonOTA/wiki beschrieben, dort gibt es auch das Skript und vorkompilierte Images, welche auch mit der B1 funktionieren.

Zur Ansteuerung unter FHEM hatte ich eine Lösung per MQTT und über einen readingsProxy gewählt (aus div. Wikieinträgen zusammengefügt), um Farbe, Dimmer und Farbtemperatur einstellen zu können. Die setList unterstützt auch andere Kommandos wie Wakup, WakeupDuration, Fade, etc. Kommandos sind hier zu finden https://github.com/arendst/Sonoff-Tasmota/wiki/Commands.

Der readingsProxy ist wie folgt definiert:


define WZ.Bodenlampe readingsProxy SonoffB1.L2:
attr WZ.Bodenlampe userattr Light Light_map structexclude
attr WZ.Bodenlampe alexaName Bodenlampe
attr WZ.Bodenlampe comment light with the ability to change RGB color
attr WZ.Bodenlampe genericDeviceType light
attr WZ.Bodenlampe group Licht
attr WZ.Bodenlampe room Alexa,Erdgeschoss,Wohnzimmer
attr WZ.Bodenlampe setFn {if( $CMD =~ m/on|off/ ) { $ARGS=$CMD;;$CMD = "" } else {fhem ("set $DEVICE state on");;} if( $CMD =~ m/hue/ ) {my ($r,$g,$b) = Color::hsv2rgb($ARGS/360,1,1);; my $rgb = Color::rgb2hex( $r*255, $g*255, $b*255 )."0000";; fhem ("set $DEVICE rgb $rgb");;} if( $CMD =~ m/rgb/ ) {my $rgb = $ARGS."0000";; fhem ("set $DEVICE rgb $rgb");;} fhem ("set $DEVICE $CMD $ARGS");; return undef;;}
attr WZ.Bodenlampe setList on:noArg off:noArg rgb:colorpicker,RGB hue:colorpicker,HUE,0,1,359 Dimmer:slider,1,1,100 CT:slider,153,1,500 WakeupDuration:slider,1,10,3600 Wakeup:slider,1,1,100 Fade:on,off Speed:slider,1,1,8
attr WZ.Bodenlampe webCmd on:off:hue:Dimmer:CT

define colorInit notify global:INITIALIZED {use Color;;Color_Initialize()}
attr colorInit room hidden


Das zugehörige MQTT Instanz sieht so aus:
define SonoffB1.L2 MQTT_DEVICE
attr SonoffB1.L2 IODev myBroker
attr SonoffB1.L2 eventMap ON:on OFF:off
attr SonoffB1.L2 genericDeviceType light
attr SonoffB1.L2 group Licht
attr SonoffB1.L2 publishSet ON OFF cmnd/SonoffB1.L2/POWER
attr SonoffB1.L2 publishSet_CT cmnd/SonoffB1.L2/CT
attr SonoffB1.L2 publishSet_Dimmer cmnd/SonoffB1.L2/Dimmer
attr SonoffB1.L2 publishSet_Fade cmnd/SonoffB1.L2/Fade
attr SonoffB1.L2 publishSet_Speed cmnd/SonoffB1.L2/Speed
attr SonoffB1.L2 publishSet_Wakeup cmnd/SonoffB1.L2/Wakeup
attr SonoffB1.L2 publishSet_WakeupDuration cmnd/SonoffB1.L2/WakeupDuration
attr SonoffB1.L2 publishSet_rgb cmnd/SonoffB1.L2/Color
attr SonoffB1.L2 room Wohnzimmer
attr SonoffB1.L2 stateFormat { ReadingsVal($name,"POWER",undef) }
attr SonoffB1.L2 subscribeReading_POWER stat/SonoffB1.L2/POWER
attr SonoffB1.L2 subscribeReading_RESULT stat/SonoffB1.L2/RESULT
attr SonoffB1.L2 subscribeReading_STATE tele/SonoffB1.L2/STATE
attr SonoffB1.L2 webCmd on:off


Die MQTT Themen, welche die B1 von sich aus noch sendet, lasse ich noch per folgendem Statement zuordnen:

define ej_sonoff expandJSON SonoffB1.*.*:.*:.{.*}

Optimal ist das nun alles noch nicht, der readingsProxy merkt sich die Einstellungen nicht und bekommt auch keine Updates mit, wenn die B1 anders (per Web UI) gesteuert wird. Wenn jemand weiß, wie man so etwas umgesetzt bekommt....

Ich hatte auch die HueBridge in Tasmota ausprobiert, allerdings ist es mir bisher nicht gelungen, die B1 damit zu steuern.

andies

Das sollten wir ins Wiki bringen, nicht jeder hat Lust die B1 mit Gewalt auseinander zu nehmen. Sehe ich das richtig, dass man dem Sonoff vorgaukelt es gäbe die updates auf dem heimischen Rechner? Ich habe leider kein neues Gerät und kann daher keine screenshots machen - so etwas wäre fürs Wiki ganz gut. Du musst auch irgendeinen Schreibfehler im Link haben, ich kam nur mit google zu der github-Seite. Danke!
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

cawe

Den Link habe ich korrigiert. Sollte nun funktionieren. Die B1 fragt regelmäßig nach einer neuen Firmware, kontaktiert dazu einen Server in China. Per DNS Spoofing lenkt man diese Anfrage auf einen heimischen Rechner, auf dem das Skript läuft. Dieses bedient die Anfrage und überträgt ein erstes Image. In einem zweiten Schritt verbindet man sich dann mit dem Rechner zu der SSID, welche die B1 aufmacht und die Zielfirmware wird geladen. Die Schritte sollte man sich dort  in dem im Wiki bei der B1 verlinkten Issue #20 anschauen.

andies

Und ich habe was im Wiki eingetragen. Irgendwann wird man diese ganzen Beiträge mit dem flashen mal löschen müssen; so ein Haufen Arbeit und nun umsonst  ::)
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Gear

Hallo Zusammen,

das ist hier schon etwas älter, aber ich wollte nicht gleich ein neues Thema aufmachen.

Ich habe die 1 so wie beschrieben eingebunden und funktioniert.
Wie kann ich da Farben oder Helligkeit einer Lightscene hinterlegen?

Gibt es da eine Möglichkeit?
Gibt es auch eine Möglichkeit gewisse Einstellungen zu wählen und diese dann zu hinterlegen um per Knopfdruck deine Einstellung zu laden?

Danke und Grüße
Gear
> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <

Freee84neu

Hallo

Hier meine Einstellungen für die B1 mit Rückmeldung wenn was über die Web Ui eingegeben wird

attr Sonoff_B1 IODev Mosquitto
attr Sonoff_B1 alias Sonoff B1
attr Sonoff_B1 devStateIcon ON:light_light_dim_100@FFFF00:OFF OFF:light_light:ON
attr Sonoff_B1 genericDeviceType light
attr Sonoff_B1 group XXX
attr Sonoff_B1 homebridgeMapping On=state,values=OFF:0;;ON:1,cmdOff=OFF,cmdOn=ON
attr Sonoff_B1 icon light_uplight
attr Sonoff_B1 publishSet ON OFF cmnd/Sonoff_B1/power
attr Sonoff_B1 publishSet_CT slider,153,1,500 cmnd/Sonoff_B1/CT
attr Sonoff_B1 publishSet_Channel_01 slider,0,1,100 cmnd/Sonoff_B1/Channel1
attr Sonoff_B1 publishSet_Channel_02 slider,0,1,100 cmnd/Sonoff_B1/Channel2
attr Sonoff_B1 publishSet_Channel_03 slider,0,1,100 cmnd/Sonoff_B1/Channel3
attr Sonoff_B1 publishSet_Channel_04 slider,0,1,100 cmnd/Sonoff_B1/Channel4
attr Sonoff_B1 publishSet_Channel_05 slider,0,1,100 cmnd/Sonoff_B1/Channel5
attr Sonoff_B1 publishSet_Dimmer slider,0,1,100 cmnd/Sonoff_B1/Dimmer
attr Sonoff_B1 publishSet_Fade 0,1 cmnd/Sonoff_B1/Fade
attr Sonoff_B1 publishSet_RESTART 1 cmnd/Sonoff_B1/RESTART
attr Sonoff_B1 publishSet_Scheme 0,1,2,3,4,+,- cmnd/Sonoff_B1/Scheme
attr Sonoff_B1 publishSet_Speed slider,1,1,20 cmnd/Sonoff_B1/Speed
attr Sonoff_B1 publishSet_Wakeup slider,0,1,100 cmnd/Sonoff_B1/Wakeup
attr Sonoff_B1 publishSet_WakeupDuration slider,1,1,3600 cmnd/Sonoff_B1/WakeupDuration
attr Sonoff_B1 publishSet_rgb 1,2,3,4,5,6,7,8,9,10,11,12,+,- cmnd/Sonoff_B1/Color
attr Sonoff_B1 room XXX
attr Sonoff_B1 stateFormat state
attr Sonoff_B1 subscribeReading_RESULT stat/Sonoff_B1/RESULT
attr Sonoff_B1 subscribeReading_state stat/Sonoff_B1/POWER
attr Sonoff_B1 webCmd Scheme

define Sonoff_B1_WerteAuslesen expandJSON Sonoff_B1.*:.*:.{.*}

Dlay

Und wo ist hier das "define" ? Was ist das für ein Gerät/Typ ?

Zitat von: Freee84neu am 22 November 2018, 15:36:14
Hallo

Hier meine Einstellungen für die B1 mit Rückmeldung wenn was über die Web Ui eingegeben wird

attr Sonoff_B1 IODev Mosquitto
attr Sonoff_B1 alias Sonoff B1
attr Sonoff_B1 devStateIcon ON:light_light_dim_100@FFFF00:OFF OFF:light_light:ON
attr Sonoff_B1 genericDeviceType light
attr Sonoff_B1 group XXX
attr Sonoff_B1 homebridgeMapping On=state,values=OFF:0;;ON:1,cmdOff=OFF,cmdOn=ON
attr Sonoff_B1 icon light_uplight
attr Sonoff_B1 publishSet ON OFF cmnd/Sonoff_B1/power
attr Sonoff_B1 publishSet_CT slider,153,1,500 cmnd/Sonoff_B1/CT
attr Sonoff_B1 publishSet_Channel_01 slider,0,1,100 cmnd/Sonoff_B1/Channel1
attr Sonoff_B1 publishSet_Channel_02 slider,0,1,100 cmnd/Sonoff_B1/Channel2
attr Sonoff_B1 publishSet_Channel_03 slider,0,1,100 cmnd/Sonoff_B1/Channel3
attr Sonoff_B1 publishSet_Channel_04 slider,0,1,100 cmnd/Sonoff_B1/Channel4
attr Sonoff_B1 publishSet_Channel_05 slider,0,1,100 cmnd/Sonoff_B1/Channel5
attr Sonoff_B1 publishSet_Dimmer slider,0,1,100 cmnd/Sonoff_B1/Dimmer
attr Sonoff_B1 publishSet_Fade 0,1 cmnd/Sonoff_B1/Fade
attr Sonoff_B1 publishSet_RESTART 1 cmnd/Sonoff_B1/RESTART
attr Sonoff_B1 publishSet_Scheme 0,1,2,3,4,+,- cmnd/Sonoff_B1/Scheme
attr Sonoff_B1 publishSet_Speed slider,1,1,20 cmnd/Sonoff_B1/Speed
attr Sonoff_B1 publishSet_Wakeup slider,0,1,100 cmnd/Sonoff_B1/Wakeup
attr Sonoff_B1 publishSet_WakeupDuration slider,1,1,3600 cmnd/Sonoff_B1/WakeupDuration
attr Sonoff_B1 publishSet_rgb 1,2,3,4,5,6,7,8,9,10,11,12,+,- cmnd/Sonoff_B1/Color
attr Sonoff_B1 room XXX
attr Sonoff_B1 stateFormat state
attr Sonoff_B1 subscribeReading_RESULT stat/Sonoff_B1/RESULT
attr Sonoff_B1 subscribeReading_state stat/Sonoff_B1/POWER
attr Sonoff_B1 webCmd Scheme

define Sonoff_B1_WerteAuslesen expandJSON Sonoff_B1.*:.*:.{.*}