diff --git a/fhem/CHANGED b/fhem/CHANGED index 2ea3abe2e..3db61cc3d 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 10_MYSENSORS_DEVICE: updated to latest MYSENSORS version - feature: 50_TelegramBot: hide cmd in favorites/changed favorites confirm - feature: 49_SSCam: V2.9.0, function get homeModeState, minor fixes, commandref revised diff --git a/fhem/FHEM/10_MYSENSORS_DEVICE.pm b/fhem/FHEM/10_MYSENSORS_DEVICE.pm index de1bb74c6..d3aaebc64 100755 --- a/fhem/FHEM/10_MYSENSORS_DEVICE.pm +++ b/fhem/FHEM/10_MYSENSORS_DEVICE.pm @@ -1,4 +1,4 @@ -############################################## +P############################################## # # fhem bridge to MySensors (see http://mysensors.org) # @@ -19,7 +19,6 @@ # You should have received a copy of the GNU General Public License # along with fhem. If not, see . # - # $Id$ # ############################################## @@ -42,16 +41,16 @@ sub MYSENSORS_DEVICE_Initialize($) { $hash->{AttrFn} = "MYSENSORS::DEVICE::Attr"; $hash->{AttrList} = - "config:M,I ". - "mode:node,repeater ". - "version:1.4 ". - "setCommands ". - "setReading_.+ ". - "mapReadingType_.+ ". - "mapReading_.+ ". - "requestAck:1 ". - "IODev ". - "showtime:0,1 ". + "config:M,I " . + "mode:node,repeater " . + "version:1.4 " . + "setCommands " . + "setReading_.+ " . + "mapReadingType_.+ " . + "mapReading_.+ " . + "requestAck:1 " . + "IODev " . + "showtime:0,1 " . $main::readingFnAttributes; main::LoadModule("MYSENSORS"); @@ -85,26 +84,26 @@ BEGIN { my %static_types = ( S_DOOR => { receives => [], sends => [V_TRIPPED,V_ARMED] }, # Door and window sensors - S_MOTION => { receives => [], sends => [V_TRIPPED] }, # MotionSensor + S_MOTION => { receives => [], sends => [V_TRIPPED,V_ARMED] }, # Motion sensors S_SMOKE => { receives => [], sends => [V_TRIPPED,V_ARMED] }, # Smoke sensor - S_LIGHT => { receives => [V_STATUS,V_WATT], sends => [V_STATUS,V_WATT] }, # Binary device (on/off), Alias for S_BINARY + S_BINARY => { receives => [V_STATUS,V_WATT], sends => [V_STATUS,V_WATT] }, # Binary device (on/off) S_DIMMER => { receives => [V_STATUS,V_PERCENTAGE,V_WATT], sends => [V_STATUS,V_PERCENTAGE,V_WATT] }, # Dimmable device of some kind S_COVER => { receives => [V_UP,V_DOWN,V_STOP,V_PERCENTAGE], sends => [V_PERCENTAGE] }, # Window covers or shades - S_TEMP => { receives => [], sends => [V_TEMP] }, # Temperature sensor + S_TEMP => { receives => [], sends => [V_TEMP,V_ID] }, # Temperature sensor S_HUM => { receives => [], sends => [V_HUM] }, # Humidity sensor S_BARO => { receives => [], sends => [V_PRESSURE,V_FORECAST] }, # Barometer sensor (Pressure) - S_WIND => { receives => [], sends => [V_WIND,V_GUST] }, # Wind sensor + S_WIND => { receives => [], sends => [V_WIND,V_GUST,V_DIRECTION] }, # Wind sensor S_RAIN => { receives => [], sends => [V_RAIN,V_RAINRATE] }, # Rain sensor - S_UV => { receives => [], sends => [V_UV] }, # UV Sensor + S_UV => { receives => [], sends => [V_UV] }, # UV sensor S_WEIGHT => { receives => [], sends => [V_WEIGHT,V_IMPEDANCE] }, # Weight sensor for scales etc. - S_POWER => { receives => [V_VAR1], sends => [V_WATT,V_KWH,V_VAR1] }, # Power measuring device, like power meters - S_HEATER => { receives => [], sends => [V_HVAC_SETPOINT_HEAT,V_HVAC_FLOW_STATE,V_TEMP] }, # Heater device - S_DISTANCE => { receives => [], sends => [V_DISTANCE] }, # Distance sensor + S_POWER => { receives => [V_VAR1], sends => [V_WATT,V_KWH,V_VAR,V_VA,V_POWER_FACTOR] }, # Power measuring device, like power meters + S_HEATER => { receives => [], sends => [V_HVAC_SETPOINT_HEAT,V_HVAC_FLOW_STATE,V_TEMP,V_STATUS] }, # Heater device + S_DISTANCE => { receives => [], sends => [V_DISTANCE,V_UNIT_PREFIX] }, # Distance sensor S_LIGHT_LEVEL => { receives => [], sends => [V_LIGHT_LEVEL] }, # Light sensor S_ARDUINO_NODE => { receives => [], sends => [] }, # Arduino node device S_ARDUINO_REPEATER_NODE => { receives => [], sends => [] }, # Arduino repeating node device S_LOCK => { receives => [V_LOCK_STATUS], sends => [V_LOCK_STATUS] }, # Lock device - S_IR => { receives => [V_IR_SEND], sends => [V_IR_RECEIVE] }, # Ir sender/receiver device + S_IR => { receives => [V_IR_SEND], sends => [V_IR_RECEIVE,V_IR_RECORD] }, # Ir sender/receiver device S_WATER => { receives => [V_VAR1], sends => [V_FLOW,V_VOLUME,V_VAR1] }, # Water meter S_AIR_QUALITY => { receives => [], sends => [V_LEVEL,V_UNIT_PREFIX] }, # Air quality sensor e.g. MQ-2 S_CUSTOM => { receives => [V_VAR1,V_VAR2,V_VAR3,V_VAR4,V_VAR5], sends => [V_VAR1,V_VAR2,V_VAR3,V_VAR4,V_VAR5] }, # Use this for custom sensors where no other fits. @@ -113,13 +112,17 @@ my %static_types = ( S_RGB_LIGHT => { receives => [V_RGB,V_WATT], sends => [V_RGB,V_WATT] }, # RGB light S_RGBW_LIGHT => { receives => [V_RGBW,V_WATT], sends => [V_RGBW,V_WATT] }, # RGBW light (with separate white component) S_COLOR_SENSOR => { receives => [V_RGB], sends => [V_RGB] }, # Color sensor - S_HVAC => { receives => [], sends => [V_HVAC_SETPOINT_HEAT,V_HVAC_SETPOINT_COOL,V_HVAC_FLOW_STATE,V_HVAC_FLOW_MODE,V_HVAC_SPEED] }, # Thermostat/HVAC device + S_HVAC => { receives => [], sends => [V_STATUS,V_TEMP,V_HVAC_SETPOINT_HEAT,V_HVAC_SETPOINT_COOL,V_HVAC_FLOW_STATE,V_HVAC_FLOW_MODE,V_HVAC_SPEED] }, # Thermostat/HVAC device S_MULTIMETER => { receives => [], sends => [V_VOLTAGE,V_CURRENT,V_IMPEDANCE] }, # Multimeter device S_SPRINKLER => { receives => [], sends => [V_STATUS,V_TRIPPED] }, # Sprinkler device S_WATER_LEAK => { receives => [], sends => [V_TRIPPED,V_ARMED] }, # Water leak sensor S_SOUND => { receives => [], sends => [V_LEVEL,V_TRIPPED,V_ARMED] }, # Sound sensor S_VIBRATION => { receives => [], sends => [V_LEVEL,V_TRIPPED,V_ARMED] }, # Vibration sensor S_MOISTURE => { receives => [], sends => [V_LEVEL,V_TRIPPED,V_ARMED] }, # Moisture sensor + S_INFO => { receives => [V_TEXT], sends => [V_TEXT] }, # LCD text device + S_GAS => { receives => [], sends => [V_FLOW,V_VOLUME] }, # Gas meter + S_GPS => { receives => [], sends => [V_POSITION] }, # GPS Sensor + S_WATER_QUALITY => { receives => [], sends => [V_TEMP,V_PH,V_ORP,V_EC,V_STATUS] }, # Water quality sensor ); my %static_mappings = ( @@ -176,6 +179,16 @@ my %static_mappings = ( V_HVAC_SETPOINT_COOL => { type => "hvacsetpointcool" }, V_HVAC_SETPOINT_HEAT => { type => "hvacsetpointheat" }, V_HVAC_FLOW_MODE => { type => "hvacflowmode" }, + V_TEXT => { type => "text" }, + V_CUSTOM => { type => "custom" }, + V_POSITION => { type => "position" }, + V_IR_RECORD => { type => "ir_record" }, + V_PH => { type => "ph" }, + V_ORP => { type => "orp" }, + V_EC => { type => "ec" }, + V_VAR => { type => "value" }, + V_VA => { type => "va" }, + V_POWER_FACTOR => { type => "power_factor" }, ); sub Define($$) { @@ -186,6 +199,7 @@ sub Define($$) { $hash->{sets} = { 'time' => "", reboot => "", +# clear => "", }; $hash->{ack} = 0; $hash->{typeMappings} = {map {variableTypeToIdx($_) => $static_mappings{$_}} keys %static_mappings}; @@ -209,10 +223,13 @@ sub Set($@) { return grep (/(^on$)|(^off$)/,keys %{$hash->{sets}}) == 2 ? SetExtensions($hash, $list, $name, $command, @values) : "Unknown argument $command, choose one of $list"; } COMMAND_HANDLER: { - $command eq "clear" and do { - sendClientMessage($hash, childId => 255, cmd => C_INTERNAL, subType => I_CHILDREN, payload => "C"); - last; - }; +# $command eq "clear" and do { +# # Test 102 anstatt 255 :) und Log +# sendClientMessage($hash, childId => 255, cmd => C_INTERNAL, subType => I_CHILDREN, payload => "C"); +# Log3 ($name,3,"MYSENSORS_DEVICE $name: clear"); +# # Test +# last; +# }; $command eq "time" and do { sendClientMessage($hash, childId => 255, cmd => C_INTERNAL, subType => I_TIME, payload => time); last; @@ -260,10 +277,10 @@ sub Attr($$$$) { $attribute eq "mode" and do { if ($command eq "set" and $value eq "repeater") { $hash->{repeater} = 1; - $hash->{sets}->{clear} = ""; +# $hash->{sets}->{clear} = ""; } else { $hash->{repeater} = 0; - delete $hash->{sets}->{clear}; +# delete $hash->{sets}->{clear}; } last; }; @@ -425,7 +442,7 @@ sub onPresentationMessage($$) { push @ret,"no setReading for $id, $typeStr"; } } - Log3 ($hash->{NAME},4,"MYSENSORS_DEVICE $hash->{NAME}: errors on C_PRESENTATION-message for childId $id, subType ".sensorTypeToStr($nodeType)." ".join (", ",@ret)) if @ret; + Log3 ($hash->{NAME}, 4, "MYSENSORS_DEVICE $hash->{NAME}: errors on C_PRESENTATION-message for childId $id, subType ".sensorTypeToStr($nodeType)." ".join (", ",@ret)) if @ret; } } @@ -434,11 +451,11 @@ sub onSetMessage($$) { if (defined $msg->{payload}) { eval { my ($reading,$value) = rawToMappedReading($hash,$msg->{subType},$msg->{childId},$msg->{payload}); - readingsSingleUpdate($hash,$reading,$value,1); + readingsSingleUpdate($hash, $reading, $value, 1); }; - Log3 ($hash->{NAME},4,"MYSENSORS_DEVICE $hash->{NAME}: ignoring C_SET-message ".GP_Catch($@)) if $@; + Log3 ($hash->{NAME}, 4, "MYSENSORS_DEVICE $hash->{NAME}: ignoring C_SET-message ".GP_Catch($@)) if $@; } else { - Log3 ($hash->{NAME},5,"MYSENSORS_DEVICE $hash->{NAME}: ignoring C_SET-message without payload"); + Log3 ($hash->{NAME}, 5, "MYSENSORS_DEVICE $hash->{NAME}: ignoring C_SET-message without payload"); } } @@ -454,7 +471,7 @@ sub onRequestMessage($$) { payload => ReadingsVal($hash->{NAME},$readingname,$val) ); }; - Log3 ($hash->{NAME},4,"MYSENSORS_DEVICE $hash->{NAME}: ignoring C_REQ-message ".GP_Catch($@)) if $@; + Log3 ($hash->{NAME}, 4, "MYSENSORS_DEVICE $hash->{NAME}: ignoring C_REQ-message ".GP_Catch($@)) if $@; } sub onInternalMessage($$) { @@ -464,16 +481,16 @@ sub onInternalMessage($$) { my $typeStr = internalMessageTypeToStr($type); INTERNALMESSAGE: { $type == I_BATTERY_LEVEL and do { - readingsSingleUpdate($hash,"batterylevel",$msg->{payload},1); - Log3 ($name,4,"MYSENSORS_DEVICE $name: batterylevel $msg->{payload}"); + readingsSingleUpdate($hash, "batterylevel", $msg->{payload}, 1); + Log3 ($name, 4, "MYSENSORS_DEVICE $name: batterylevel $msg->{payload}"); last; }; $type == I_TIME and do { if ($msg->{ack}) { - Log3 ($name,4,"MYSENSORS_DEVICE $name: response to time-request acknowledged"); + Log3 ($name, 4, "MYSENSORS_DEVICE $name: response to time-request acknowledged"); } else { sendClientMessage($hash,cmd => C_INTERNAL, childId => 255, subType => I_TIME, payload => time); - Log3 ($name,4,"MYSENSORS_DEVICE $name: update of time requested"); + Log3 ($name, 4, "MYSENSORS_DEVICE $name: update of time requested"); } last; }; @@ -495,11 +512,11 @@ sub onInternalMessage($$) { }; $type == I_CONFIG and do { if ($msg->{ack}) { - Log3 ($name,4,"MYSENSORS_DEVICE $name: response to config-request acknowledged"); + Log3 ($name, 4, "MYSENSORS_DEVICE $name: response to config-request acknowledged"); } else { - readingsSingleUpdate($hash,"parentId",$msg->{payload},1); + readingsSingleUpdate($hash, "parentId", $msg->{payload}, 1); sendClientMessage($hash,cmd => C_INTERNAL, childId => 255, subType => I_CONFIG, payload => AttrVal($name,"config","M")); - Log3 ($name,4,"MYSENSORS_DEVICE $name: respond to config-request, node parentId = " . $msg->{payload}); + Log3 ($name, 4, "MYSENSORS_DEVICE $name: respond to config-request, node parentId = " . $msg->{payload}); } last; }; @@ -516,18 +533,18 @@ sub onInternalMessage($$) { last; }; $type == I_CHILDREN and do { - readingsSingleUpdate($hash,"state","routingtable cleared",1); - Log3 ($name,4,"MYSENSORS_DEVICE $name: routingtable cleared"); + readingsSingleUpdate($hash, "state", "routingtable cleared", 1); + Log3 ($name, 3, "MYSENSORS_DEVICE $name: routingtable cleared"); last; }; $type == I_SKETCH_NAME and do { $hash->{$typeStr} = $msg->{payload}; - readingsSingleUpdate($hash,"SKETCH_NAME",$msg->{payload},1); + readingsSingleUpdate($hash, "SKETCH_NAME", $msg->{payload}, 1); last; }; $type == I_SKETCH_VERSION and do { $hash->{$typeStr} = $msg->{payload}; - readingsSingleUpdate($hash,"SKETCH_VERSION",$msg->{payload},1); + readingsSingleUpdate($hash, "SKETCH_VERSION", $msg->{payload}, 1); last; }; $type == I_REBOOT and do { @@ -594,6 +611,10 @@ sub mappedReadingToRaw($$$) { 1; =pod +=item device +=item summary includes MYSENSOR clients +=item summary_DE integriert MYSENSOR Sensoren + =begin html diff --git a/fhem/FHEM/lib/Device/MySensors/Constants.pm b/fhem/FHEM/lib/Device/MySensors/Constants.pm index ebe2fe22e..32e3ed73b 100644 --- a/fhem/FHEM/lib/Device/MySensors/Constants.pm +++ b/fhem/FHEM/lib/Device/MySensors/Constants.pm @@ -20,52 +20,62 @@ sub commandToStr($) { #-- Variable types use constant { V_TEMP => 0, - V_HUM => 1, - V_STATUS => 2, - V_PERCENTAGE => 3, - V_PRESSURE => 4, - V_FORECAST => 5, + V_HUM => 1, + V_STATUS => 2, + V_PERCENTAGE => 3, + V_PRESSURE => 4, + V_FORECAST => 5, V_RAIN => 6, - V_RAINRATE => 7, + V_RAINRATE => 7, V_WIND => 8, V_GUST => 9, - V_DIRECTION => 10, - V_UV => 11, - V_WEIGHT => 12, - V_DISTANCE => 13, - V_IMPEDANCE => 14, - V_ARMED => 15, - V_TRIPPED => 16, + V_DIRECTION => 10, + V_UV => 11, + V_WEIGHT => 12, + V_DISTANCE => 13, + V_IMPEDANCE => 14, + V_ARMED => 15, + V_TRIPPED => 16, V_WATT => 17, - V_KWH => 18, - V_SCENE_ON => 19, - V_SCENE_OFF => 20, - V_HVAC_FLOW_STATE => 21, - V_HVAC_SPEED => 22, - V_LIGHT_LEVEL => 23, + V_KWH => 18, + V_SCENE_ON => 19, + V_SCENE_OFF => 20, + V_HVAC_FLOW_STATE => 21, + V_HVAC_SPEED => 22, + V_LIGHT_LEVEL => 23, V_VAR1 => 24, V_VAR2 => 25, V_VAR3 => 26, V_VAR4 => 27, V_VAR5 => 28, - V_UP => 29, + V_UP => 29, V_DOWN => 30, V_STOP => 31, - V_IR_SEND => 32, - V_IR_RECEIVE => 33, + V_IR_SEND => 32, + V_IR_RECEIVE => 33, V_FLOW => 34, - V_VOLUME => 35, - V_LOCK_STATUS => 36, - V_LEVEL => 37, - V_VOLTAGE => 38, - V_CURRENT => 39, - V_RGB => 40, + V_VOLUME => 35, + V_LOCK_STATUS => 36, + V_LEVEL => 37, + V_VOLTAGE => 38, + V_CURRENT => 39, + V_RGB => 40, V_RGBW => 41, - V_ID => 42, - V_UNIT_PREFIX => 43, - V_HVAC_SETPOINT_COOL => 44, - V_HVAC_SETPOINT_HEAT => 45, - V_HVAC_FLOW_MODE => 46, + V_ID => 42, + V_UNIT_PREFIX => 43, + V_HVAC_SETPOINT_COOL => 44, + V_HVAC_SETPOINT_HEAT => 45, + V_HVAC_FLOW_MODE => 46, + V_TEXT => 47, + V_CUSTOM => 48, + V_POSITION => 49, + V_IR_RECORD => 50, + V_PH => 51, + V_ORP => 52, + V_EC => 53, + V_VAR => 54, + V_VA => 55, + V_POWER_FACTOR => 56, }; use constant variableTypes => qw{ V_TEMP V_HUM V_STATUS V_PERCENTAGE V_PRESSURE V_FORECAST V_RAIN @@ -73,7 +83,8 @@ use constant variableTypes => qw{ V_TEMP V_HUM V_STATUS V_PERCENTAGE V_PRESSURE V_IMPEDANCE V_ARMED V_TRIPPED V_WATT V_KWH V_SCENE_ON V_SCENE_OFF V_HVAC_FLOW_STATE V_HVAC_SPEED V_LIGHT_LEVEL V_VAR1 V_VAR2 V_VAR3 V_VAR4 V_VAR5 V_UP V_DOWN V_STOP V_IR_SEND V_IR_RECEIVE V_FLOW V_VOLUME V_LOCK_STATUS - V_LEVEL V_VOLTAGE V_CURRENT V_RGB V_RGBW V_ID V_UNIT_PREFIX V_HVAC_SETPOINT_COOL V_HVAC_SETPOINT_HEAT V_HVAC_FLOW_MODE}; + V_LEVEL V_VOLTAGE V_CURRENT V_RGB V_RGBW V_ID V_UNIT_PREFIX V_HVAC_SETPOINT_COOL V_HVAC_SETPOINT_HEAT V_HVAC_FLOW_MODE + V_TEXT V_CUSTOM V_POSITION V_IR_RECORD V_PH V_ORP V_EC V_VAR V_VA V_POWER_FACTOR }; sub variableTypeToStr($) { (variableTypes)[shift]; @@ -120,7 +131,7 @@ use constant { S_DOOR => 0, S_MOTION => 1, S_SMOKE => 2, - S_LIGHT => 3, + S_BINARY => 3, S_DIMMER => 4, S_COVER => 5, S_TEMP => 6, @@ -153,13 +164,17 @@ use constant { S_SOUND => 33, S_VIBRATION => 34, S_MOISTURE => 35, + S_INFO => 36, + S_GAS => 37, + S_GPS => 38, + S_WATER_QUALITY => 39, }; -use constant sensorTypes => qw{ S_DOOR S_MOTION S_SMOKE S_LIGHT S_DIMMER S_COVER S_TEMP S_HUM S_BARO S_WIND +use constant sensorTypes => qw{ S_DOOR S_MOTION S_SMOKE S_BINARY S_DIMMER S_COVER S_TEMP S_HUM S_BARO S_WIND S_RAIN S_UV S_WEIGHT S_POWER S_HEATER S_DISTANCE S_LIGHT_LEVEL S_ARDUINO_NODE S_ARDUINO_REPEATER_NODE S_LOCK S_IR S_WATER S_AIR_QUALITY S_CUSTOM S_DUST S_SCENE_CONTROLLER S_RGB_LIGHT S_RGBW_LIGHT S_COLOR_SENSOR S_HVAC S_MULTIMETER S_SPRINKLER S_WATER_LEAK S_SOUND S_VIBRATION - S_MOISTURE}; + S_MOISTURE S_INFO S_GAS S_GPS S_WATER_QUALITY}; sub sensorTypeToStr($) { (sensorTypes)[shift]; @@ -196,9 +211,10 @@ use constant { P_LONG32 => 4, P_ULONG32 => 5, P_CUSTOM => 6, + P_FLOAT32 => 7, }; -use constant payloadTypes => qw{ P_STRING P_BYTE P_INT16 P_UINT16 P_LONG32 P_ULONG32 P_CUSTOM }; +use constant payloadTypes => qw{ P_STRING P_BYTE P_INT16 P_UINT16 P_LONG32 P_ULONG32 P_CUSTOM P_FLOAT32 }; sub payloadTypeToStr($) { (payloadTypes)[shift]; diff --git a/fhem/MAINTAINER.txt b/fhem/MAINTAINER.txt index 5b4ce808e..4f1db7592 100644 --- a/fhem/MAINTAINER.txt +++ b/fhem/MAINTAINER.txt @@ -65,7 +65,7 @@ FHEM/10_KOPP_FC.pm raspii Sonstige Systeme FHEM/10_MAX.pm rudolfkoenig/orphan MAX FHEM/10_MQTT_BRIDGE eisler MQTT FHEM/10_MQTT_DEVICE eisler MQTT -FHEM/10_MYSENSORS_DEVICE ntruchsess Sonstige Systeme +FHEM/10_MYSENSORS_DEVICE Hauswart Sonstige Systeme FHEM/10_OWServer.pm neubert/mfr69bs 1Wire FHEM/10_SOMFY.pm viegener Sonstige Systeme FHEM/10_UNIRoll.pm C_Herrmann SlowRF @@ -489,7 +489,7 @@ FHEM/UConv.pm loredo FHEM Development FHEM/Unit.pm loredo FHEM Development FHEM/YahooWeatherAPI.pm neubert Unterstuetzende Dienste/Wettermodule FHEM/lib/Device/Firmata/* ntruchsess Sonstige Systeme -FHEM/lib/Device/MySensors/* ntruchsess Sonstige Systeme +FHEM/lib/Device/MySensors/* Hauswart Sonstige Systeme FHEM/lib/MP3/* Reinerlein Multimedia FHEM/lib/Net/MQTT.pod eisler MQTT FHEM/lib/Net/MQTT/* eisler MQTT