mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-02-24 15:24:51 +00:00
00_Mysensors: (+10_MYSENSORS_DEVICE) PBP patch (#110674); add extended getter info
git-svn-id: https://svn.fhem.de/fhem/trunk@21925 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
75b95ecce0
commit
2e16ea71c6
@ -1,5 +1,9 @@
|
|||||||
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
# 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.
|
# Do not insert empty lines here, update check depends on it.
|
||||||
|
- change: 00_MYSENSORS: apply some PBP recommendations,
|
||||||
|
integrate libs from fib/Device/MySensors
|
||||||
|
- feature: 10_MYSENSORS_DEVICE: PBP, see 00_MYSENSORS;
|
||||||
|
expand getter feedback, shorten list info (no static info)
|
||||||
- change: 93_Log2Syslog: add device in check message by attr 'exclErrCond'
|
- change: 93_Log2Syslog: add device in check message by attr 'exclErrCond'
|
||||||
- feature: 57_Calendar: new attribute delay
|
- feature: 57_Calendar: new attribute delay
|
||||||
- feature: 72_XiaomiDevice: supporting EvpHumidifier and AirPurifier3H
|
- feature: 72_XiaomiDevice: supporting EvpHumidifier and AirPurifier3H
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,299 +0,0 @@
|
|||||||
package Device::MySensors::Constants;
|
|
||||||
|
|
||||||
use List::Util qw(first);
|
|
||||||
|
|
||||||
#-- Message types
|
|
||||||
use constant {
|
|
||||||
C_PRESENTATION => 0,
|
|
||||||
C_SET => 1,
|
|
||||||
C_REQ => 2,
|
|
||||||
C_INTERNAL => 3,
|
|
||||||
C_STREAM => 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
use constant commands => qw( C_PRESENTATION C_SET C_REQ C_INTERNAL C_STREAM );
|
|
||||||
|
|
||||||
sub commandToStr($) {
|
|
||||||
(commands)[shift];
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- Variable types
|
|
||||||
use constant {
|
|
||||||
V_TEMP => 0,
|
|
||||||
V_HUM => 1,
|
|
||||||
V_STATUS => 2,
|
|
||||||
V_PERCENTAGE => 3,
|
|
||||||
V_PRESSURE => 4,
|
|
||||||
V_FORECAST => 5,
|
|
||||||
V_RAIN => 6,
|
|
||||||
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_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_VAR1 => 24,
|
|
||||||
V_VAR2 => 25,
|
|
||||||
V_VAR3 => 26,
|
|
||||||
V_VAR4 => 27,
|
|
||||||
V_VAR5 => 28,
|
|
||||||
V_UP => 29,
|
|
||||||
V_DOWN => 30,
|
|
||||||
V_STOP => 31,
|
|
||||||
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_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_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
|
|
||||||
V_RAINRATE V_WIND V_GUST V_DIRECTION V_UV V_WEIGHT V_DISTANCE
|
|
||||||
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_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];
|
|
||||||
}
|
|
||||||
|
|
||||||
sub variableTypeToIdx($) {
|
|
||||||
my $var = shift;
|
|
||||||
return first { (variableTypes)[$_] eq $var } 0 .. scalar(variableTypes);
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- Internal messages
|
|
||||||
use constant {
|
|
||||||
I_BATTERY_LEVEL => 0,
|
|
||||||
I_TIME => 1,
|
|
||||||
I_VERSION => 2,
|
|
||||||
I_ID_REQUEST => 3,
|
|
||||||
I_ID_RESPONSE => 4,
|
|
||||||
I_INCLUSION_MODE => 5,
|
|
||||||
I_CONFIG => 6,
|
|
||||||
I_FIND_PARENT => 7,
|
|
||||||
I_FIND_PARENT_RESPONSE => 8,
|
|
||||||
I_LOG_MESSAGE => 9,
|
|
||||||
I_CHILDREN => 10,
|
|
||||||
I_SKETCH_NAME => 11,
|
|
||||||
I_SKETCH_VERSION => 12,
|
|
||||||
I_REBOOT => 13,
|
|
||||||
I_GATEWAY_READY => 14,
|
|
||||||
I_REQUEST_SIGNING => 15,
|
|
||||||
I_GET_NONCE => 16,
|
|
||||||
I_GET_NONCE_RESPONSE => 17,
|
|
||||||
I_HEARTBEAT_REQUEST => 18,
|
|
||||||
I_PRESENTATION => 19,
|
|
||||||
I_DISCOVER_REQUEST => 20,
|
|
||||||
I_DISCOVER_RESPONSE => 21,
|
|
||||||
I_HEARTBEAT_RESPONSE => 22,
|
|
||||||
I_LOCKED => 23, # Node is locked (reason in string-payload)
|
|
||||||
I_PING => 24, # Ping sent to node, payload incremental hop counter
|
|
||||||
I_PONG => 25, # In return to ping, sent back to sender, payload incremental hop counter
|
|
||||||
I_REGISTRATION_REQUEST => 26, # Register request to GW
|
|
||||||
I_REGISTRATION_RESPONSE => 27, # Register response from GW
|
|
||||||
I_DEBUG => 28,
|
|
||||||
I_SIGNAL_REPORT_REQUEST => 29,
|
|
||||||
I_SIGNAL_REPORT_REVERSE => 30,
|
|
||||||
I_SIGNAL_REPORT_RESPONSE => 31,
|
|
||||||
I_PRE_SLEEP_NOTIFICATION => 32,
|
|
||||||
I_POST_SLEEP_NOTIFICATION => 33,
|
|
||||||
};
|
|
||||||
|
|
||||||
use constant internalMessageTypes => qw{ I_BATTERY_LEVEL I_TIME I_VERSION I_ID_REQUEST I_ID_RESPONSE
|
|
||||||
I_INCLUSION_MODE I_CONFIG I_FIND_PARENT I_FIND_PARENT_RESPONSE
|
|
||||||
I_LOG_MESSAGE I_CHILDREN I_SKETCH_NAME I_SKETCH_VERSION
|
|
||||||
I_REBOOT I_GATEWAY_READY I_REQUEST_SIGNING I_GET_NONCE I_GET_NONCE_RESPONSE I_HEARTBEAT_REQUEST I_PRESENTATION I_DISCOVER_REQUEST
|
|
||||||
I_DISCOVER_RESPONSE I_HEARTBEAT_RESPONSE I_LOCKED I_PING I_PONG I_REGISTRATION_REQUEST I_REGISTRATION_RESPONSE I_DEBUG
|
|
||||||
I_SIGNAL_REPORT_REQUEST I_SIGNAL_REPORT_REVERSE I_SIGNAL_REPORT_RESPONSE I_PRE_SLEEP_NOTIFICATION I_POST_SLEEP_NOTIFICATION };
|
|
||||||
|
|
||||||
sub internalMessageTypeToStr($) {
|
|
||||||
(internalMessageTypes)[shift];
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- Sensor types
|
|
||||||
use constant {
|
|
||||||
S_DOOR => 0,
|
|
||||||
S_MOTION => 1,
|
|
||||||
S_SMOKE => 2,
|
|
||||||
S_BINARY => 3,
|
|
||||||
S_DIMMER => 4,
|
|
||||||
S_COVER => 5,
|
|
||||||
S_TEMP => 6,
|
|
||||||
S_HUM => 7,
|
|
||||||
S_BARO => 8,
|
|
||||||
S_WIND => 9,
|
|
||||||
S_RAIN => 10,
|
|
||||||
S_UV => 11,
|
|
||||||
S_WEIGHT => 12,
|
|
||||||
S_POWER => 13,
|
|
||||||
S_HEATER => 14,
|
|
||||||
S_DISTANCE => 15,
|
|
||||||
S_LIGHT_LEVEL => 16,
|
|
||||||
S_ARDUINO_NODE => 17,
|
|
||||||
S_ARDUINO_REPEATER_NODE => 18,
|
|
||||||
S_LOCK => 19,
|
|
||||||
S_IR => 20,
|
|
||||||
S_WATER => 21,
|
|
||||||
S_AIR_QUALITY => 22,
|
|
||||||
S_CUSTOM => 23,
|
|
||||||
S_DUST => 24,
|
|
||||||
S_SCENE_CONTROLLER => 25,
|
|
||||||
S_RGB_LIGHT => 26,
|
|
||||||
S_RGBW_LIGHT => 27,
|
|
||||||
S_COLOR_SENSOR => 28,
|
|
||||||
S_HVAC => 29,
|
|
||||||
S_MULTIMETER => 30,
|
|
||||||
S_SPRINKLER => 31,
|
|
||||||
S_WATER_LEAK => 32,
|
|
||||||
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_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_INFO S_GAS S_GPS S_WATER_QUALITY };
|
|
||||||
|
|
||||||
sub sensorTypeToStr($) {
|
|
||||||
(sensorTypes)[shift];
|
|
||||||
}
|
|
||||||
|
|
||||||
sub sensorTypeToIdx($) {
|
|
||||||
my $var = shift;
|
|
||||||
return first { (sensorTypes)[$_] eq $var } 0 .. scalar(sensorTypes);
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- Datastream types
|
|
||||||
use constant {
|
|
||||||
ST_FIRMWARE_CONFIG_REQUEST => 0,
|
|
||||||
ST_FIRMWARE_CONFIG_RESPONSE => 1,
|
|
||||||
ST_FIRMWARE_REQUEST => 2,
|
|
||||||
ST_FIRMWARE_RESPONSE => 3,
|
|
||||||
ST_SOUND => 4,
|
|
||||||
ST_IMAGE => 5,
|
|
||||||
};
|
|
||||||
|
|
||||||
use constant datastreamTypes => qw{ ST_FIRMWARE_CONFIG_REQUEST ST_FIRMWARE_CONFIG_RESPONSE ST_FIRMWARE_REQUEST ST_FIRMWARE_RESPONSE
|
|
||||||
ST_SOUND ST_IMAGE };
|
|
||||||
|
|
||||||
sub datastreamTypeToStr($) {
|
|
||||||
(datastreamTypes)[shift];
|
|
||||||
}
|
|
||||||
|
|
||||||
#-- Payload types
|
|
||||||
use constant {
|
|
||||||
P_STRING => 0,
|
|
||||||
P_BYTE => 1,
|
|
||||||
P_INT16 => 2,
|
|
||||||
P_UINT16 => 3,
|
|
||||||
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 P_FLOAT32 };
|
|
||||||
|
|
||||||
sub payloadTypeToStr($) {
|
|
||||||
(payloadTypes)[shift];
|
|
||||||
}
|
|
||||||
|
|
||||||
sub subTypeToStr($$) {
|
|
||||||
my $cmd = shift;
|
|
||||||
my $subType = shift;
|
|
||||||
# Convert subtype to string, depending on message type
|
|
||||||
TYPE: {
|
|
||||||
$cmd == C_PRESENTATION and do {
|
|
||||||
$subType = (sensorTypes)[$subType];
|
|
||||||
last;
|
|
||||||
};
|
|
||||||
$cmd == C_SET and do {
|
|
||||||
$subType = (variableTypes)[$subType];
|
|
||||||
last;
|
|
||||||
};
|
|
||||||
$cmd == C_REQ and do {
|
|
||||||
$subType = (variableTypes)[$subType];
|
|
||||||
last;
|
|
||||||
};
|
|
||||||
$cmd == C_INTERNAL and do {
|
|
||||||
$subType = (internalMessageTypes)[$subType];
|
|
||||||
last;
|
|
||||||
};
|
|
||||||
$cmd == C_STREAM and do {
|
|
||||||
$subType = (datastreamTypes)[$subType];
|
|
||||||
last;
|
|
||||||
};
|
|
||||||
$subType = "<UNKNOWN_$subType>";
|
|
||||||
}
|
|
||||||
return $subType;
|
|
||||||
}
|
|
||||||
|
|
||||||
use Exporter ('import');
|
|
||||||
@EXPORT = ();
|
|
||||||
@EXPORT_OK = (
|
|
||||||
commands,
|
|
||||||
variableTypes,
|
|
||||||
internalMessageTypes,
|
|
||||||
sensorTypes,
|
|
||||||
datastreamTypes,
|
|
||||||
payloadTypes,
|
|
||||||
qw(commandToStr
|
|
||||||
variableTypeToStr
|
|
||||||
variableTypeToIdx
|
|
||||||
internalMessageTypeToStr
|
|
||||||
sensorTypeToStr
|
|
||||||
sensorTypeToIdx
|
|
||||||
datastreamTypeToStr
|
|
||||||
payloadTypeToStr
|
|
||||||
subTypeToStr
|
|
||||||
commands
|
|
||||||
variableTypes
|
|
||||||
internalMessageTypes
|
|
||||||
sensorTypes
|
|
||||||
datastreamTypes
|
|
||||||
payloadTypes
|
|
||||||
));
|
|
||||||
|
|
||||||
%EXPORT_TAGS = (all => [@EXPORT_OK]);
|
|
||||||
|
|
||||||
1;
|
|
@ -1,62 +0,0 @@
|
|||||||
package Device::MySensors::Message;
|
|
||||||
|
|
||||||
use Device::MySensors::Constants qw(:all);
|
|
||||||
|
|
||||||
use Exporter ('import');
|
|
||||||
@EXPORT = ();
|
|
||||||
@EXPORT_OK = qw(parseMsg createMsg dumpMsg);
|
|
||||||
%EXPORT_TAGS = (all => [@EXPORT_OK]);
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
|
|
||||||
sub parseMsg {
|
|
||||||
my $txt = shift;
|
|
||||||
|
|
||||||
use bytes;
|
|
||||||
|
|
||||||
return if ($txt !~ m{\A
|
|
||||||
(?<nodeid> [0-9]+);
|
|
||||||
(?<childid> [0-9]+);
|
|
||||||
(?<command> [0-4]);
|
|
||||||
(?<ack> [01]);
|
|
||||||
(?<type> [0-9]{1,2});
|
|
||||||
(?<payload> .*)
|
|
||||||
\z}xms);
|
|
||||||
|
|
||||||
return {
|
|
||||||
radioId => $+{nodeid}, # docs speak of "nodeId"
|
|
||||||
childId => $+{childid},
|
|
||||||
cmd => $+{command},
|
|
||||||
ack => $+{ack},
|
|
||||||
subType => $+{type},
|
|
||||||
payload => $+{payload}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub createMsg {
|
|
||||||
my %msgRef = @_;
|
|
||||||
my @fields = ( $msgRef{'radioId'} // -1,
|
|
||||||
$msgRef{'childId'} // -1,
|
|
||||||
$msgRef{'cmd'} // -1,
|
|
||||||
$msgRef{'ack'} // -1,
|
|
||||||
$msgRef{'subType'} // -1,
|
|
||||||
$msgRef{'payload'} // "");
|
|
||||||
return join(';', @fields);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub dumpMsg {
|
|
||||||
my $msgRef = shift;
|
|
||||||
my $cmd = defined $msgRef->{'cmd'} ? commandToStr($msgRef->{'cmd'}) : "''";
|
|
||||||
my $st = (defined $msgRef->{'cmd'} and defined $msgRef->{'subType'}) ? subTypeToStr( $msgRef->{'cmd'}, $msgRef->{'subType'} ) : "''";
|
|
||||||
return sprintf("Rx: fr=%03d ci=%03d c=%03d(%-14s) st=%03d(%-16s) ack=%d %s\n", $msgRef->{'radioId'} // -1, $msgRef->{'childId'} // -1, $msgRef->{'cmd'} // -1, $cmd, $msgRef->{'subType'} // -1, $st, $msgRef->{'ack'} // -1, "'".($msgRef->{'payload'} // "")."'");
|
|
||||||
}
|
|
||||||
|
|
||||||
sub gettime {
|
|
||||||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
|
|
||||||
$year += 1900;
|
|
||||||
$mon++;
|
|
||||||
return sprintf("%04d%02d%02d-%02d:%02d:%02d", $year, $mon, $mday, $hour, $min, $sec);
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
|
Loading…
x
Reference in New Issue
Block a user