2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-28 02:44:53 +00:00

msg: remove old 75_MSG.pm and replace it by new msg command (forum )

git-svn-id: https://svn.fhem.de/fhem/trunk@9760 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
jpawlowski 2015-11-03 09:10:22 +00:00
parent b43ad2a10f
commit 96951c11c7
8 changed files with 2340 additions and 2430 deletions

@ -1,7 +1,11 @@
# 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.
- bugfix 98_Text2Speech: Google fixed, svox-pico added
- bugfix 00_SIGNALduino: Updated Firmware (3.8.1-HF1)
- change: ATTENTION: Removed deprecated module 75_MSG.pm. Users will need to
manually change their device definitions to MSGFile or MSGMail
respectively.
- feature: Introduce FHEM message routing by new command 'msg'
- bugfix: 98_Text2Speech: Google fixed, svox-pico added
- bugfix: 00_SIGNALduino: Updated Firmware (3.8.1-HF1)
fixed send raw
- updated: 74_AMAD: New Mijor Release 0.8.1
- bugfix: 74_AMAD: fix call statusRequest then screen off is set
@ -18,8 +22,8 @@
toggle between to BT Devices, clear Notificationbar
(Automagic,All), play Notify Soundfile (WallClock),
check for a activ task on the tablet/phone
- bugfix: 74_AMAD: improved error handling
- bugfix: 70_PIONEERAVR: fixed the decoding for the reading "display".
- bugfix: 74_AMAD: improved error handling
- bugfix: 70_PIONEERAVR: fixed the decoding for the reading "display".
- feature: 93_DbLog: Added support for longpoll SVG.
- feature: contrib/98_openweathermap.pm - add support for stationByZip.
e.g. 76133,de will find weather data for Karlsruhe,Germany

@ -136,7 +136,11 @@ sub Pushover_Define($$) {
# start Validation Timer
RemoveInternalTimer($hash);
InternalTimer( gettimeofday() + 5, "Pushover_ValidateUser", $hash, 0 );
if (ReadingsVal($name,"tokenState","invalid") ne "valid" || ReadingsVal($name,"userState","invalid") ne "valid" || $init_done) {
InternalTimer( gettimeofday() + 5, "Pushover_ValidateUser", $hash, 0 );
} else {
InternalTimer( gettimeofday() + 21600, "Pushover_ValidateUser", $hash, 0 );
}
return undef;
}
@ -170,13 +174,17 @@ sub Pushover_Set($@) {
. join( " ", sort keys %sets );
}
if ( AttrVal( $name, "disable", 0 ) == 1 ) {
return "Device is disabled";
}
return "Unable to send message: Device is disabled"
if ( AttrVal( $name, "disable", 0 ) == 1 );
if ( $cmd eq 'msg' ) {
return Pushover_SetMessage( $hash, @args );
}
return "Unable to send message: User key is invalid"
if ( ReadingsVal( $name, "userState", "invalid" ) eq "invalid" );
return "Unable to send message: App token is invalid"
if ( ReadingsVal( $name, "tokenState", "invalid" ) eq "invalid" );
return Pushover_SetMessage( $hash, @args )
if ( $cmd eq 'msg' );
}
#------------------------------------------------------------------------------
@ -310,7 +318,7 @@ sub Pushover_ReceiveCommand($$$) {
my $values = $param->{type};
my $return;
Log3 $name, 5, "Pushover $name: called function Pushover_ReceiveCommand()";
Log3 $name, 5, "Pushover $name: Received HttpUtils callback:\n\nPARAM:\n".Dumper($param)."\n\nERROR:\n".Dumper($err)."\n\nDATA:\n".Dumper($data);
readingsBeginUpdate($hash);
@ -378,6 +386,81 @@ sub Pushover_ReceiveCommand($$$) {
#
$values{result} = "ok";
# extract API stats
my $apiLimit = 7500;
my $apiRemaining = 1;
my $apiReset;
if ( $param->{httpheader} =~ m/X-Limit-App-Limit:[\s\t]*(.*)[\s\t\n]*/ ) {
$apiLimit = $1;
readingsBulkUpdate( $hash, "apiLimit", $1 )
if ( ReadingsVal($name,"apiLimit","") ne $1 );
}
if ( $param->{httpheader} =~ m/X-Limit-App-Remaining:[\s\t]*(.*)[\s\t\n]*/ ) {
$apiRemaining = $1;
readingsBulkUpdate( $hash, "apiRemaining", $1 )
if ( ReadingsVal($name,"apiRemaining","") ne $1 );
}
if ( $param->{httpheader} =~ m/X-Limit-App-Reset:[\s\t]*(.*)[\s\t\n]*/ ) {
$apiReset = $1;
readingsBulkUpdate( $hash, "apiReset", $1 )
if ( ReadingsVal($name,"apiReset","") ne $1 );
}
# Server error
if ($param->{code} >= 500) {
$state = "error";
$values{result} = "Server Error " . $param->{code};
}
# error handling
elsif ( ($param->{code} == 200 || $param->{code} >= 400) &&
( (ref($return) eq "HASH" && $return->{status} ne "1") || (ref($return) ne "HASH" && $return !~ m/"status":1,/) ) ) {
$values{result} = "Error " . $param->{code} . ": Unspecified error occured";
if (ref($return) eq "HASH" && defined $return->{errors}) {
$values{result} =
"Error " . $param->{code} . ": " . join( ". ", @{ $return->{errors} } ) . ".";
}
elsif ( ref($return) ne "HASH" && $return =~ m/"errors":\[(.*)\]/ ) {
$values{result} = "Error " . $param->{code} . ": " . $1;
}
$state = "error";
if ( ref($return) eq "HASH" && defined($return->{token}) ) {
$state = "unauthorized";
readingsBulkUpdate( $hash, "tokenState", $return->{token} )
if ( ReadingsVal($name,"tokenState","") ne $return->{token} );
} elsif ( ref($return) ne "HASH" && $return =~ m/"token":"invalid"/ ) {
$state = "unauthorized";
readingsBulkUpdate( $hash, "tokenState", "invalid" )
if ( ReadingsVal($name,"tokenState","") ne "invalid" );
} else {
readingsBulkUpdate( $hash, "tokenState", "valid" )
if ( ReadingsVal($name,"tokenState","") ne "valid" );
}
if ( ref($return) eq "HASH" && defined($return->{user}) ) {
$state = "unauthorized";
readingsBulkUpdate( $hash, "tokenState", $return->{user} )
if ( ReadingsVal($name,"tokenState","") ne $return->{user} );
} elsif ( ref($return) ne "HASH" && $return =~ m/"user":"invalid"/ ) {
$state = "unauthorized";
readingsBulkUpdate( $hash, "userState", "invalid" )
if ( ReadingsVal($name,"userState","") ne "invalid" );
} else {
readingsBulkUpdate( $hash, "userState", "valid" )
if ( ReadingsVal($name,"userState","") ne "valid" );
}
} else {
$state = "limited" if($apiRemaining < 1);
readingsBulkUpdate( $hash, "tokenState", "valid" )
if ( ReadingsVal($name,"tokenState","") ne "valid" );
readingsBulkUpdate( $hash, "userState", "valid" )
if ( ReadingsVal($name,"userState","") ne "valid" );
}
# messages.json
if ( $service eq "messages.json" ) {
@ -391,23 +474,11 @@ sub Pushover_ReceiveCommand($$$) {
if ( $values->{action} eq "" );
readingsBulkUpdate( $hash, "lastDevice", $values->{device} )
if ( $values->{device} ne "" );
readingsBulkUpdate( $hash, "lastDevice", $hash->{DEVICES} )
if ( $values->{device} eq "" && defined( $hash->{DEVICES} ) );
readingsBulkUpdate( $hash, "lastDevice", "all" )
if ( $values->{device} eq "" && !defined( $hash->{DEVICES} ) );
readingsBulkUpdate( $hash, "lastDevice", ReadingsVal($name, "devices", "all") )
if ( $values->{device} eq "" );
if ( ref($return) eq "HASH" ) {
if ( $return->{status} ne "1" && defined $return->{errors} ) {
$values{result} =
"Error: " . Dumper( $return->{errors} );
$state = "error";
}
elsif ( $return->{status} ne "1" ) {
$values{result} = "Unspecified error";
$state = "error";
}
readingsBulkUpdate( $hash, "lastRequest", $return->{request} )
if ( defined $return->{request} );
@ -427,7 +498,7 @@ sub Pushover_ReceiveCommand($$$) {
}
else {
readingsBulkUpdate( $hash, "cbDev_" . $values->{cbNr},
$hash->{DEVICES} );
ReadingsVal($name, "devices", "all") );
}
if ( defined $return->{receipt} ) {
@ -446,16 +517,6 @@ sub Pushover_ReceiveCommand($$$) {
}
}
# simple error handling if no JSON module was loaded
elsif ( $return !~ m/"status":1,/ ) {
$state = "error";
if ( $return =~ m/"errors":\[(.*)\]/ ) {
$values{result} = "Error: " . $1;
}
else {
$values{result} = "Unspecified error";
}
}
elsif ( $values{expire} ne "" ) {
$values{result} =
"SoftFail: Callback not supported. Please install Perl::JSON";
@ -464,36 +525,17 @@ sub Pushover_ReceiveCommand($$$) {
# users/validate.json
elsif ( $service eq "users/validate.json" ) {
if ( ref($return) eq "HASH" ) {
my $devices = "-";
my $group = "0";
$devices = join( ",", @{ $return->{devices} } ) if (defined($return->{devices}));
$group = $return->{group} if (defined($return->{group}));
if ( $return->{status} ne "1" && defined $return->{errors} ) {
$values{result} =
"Error: " . join( ". ", @{ $return->{errors} } ) . ".";
$state = "unauthorized";
}
elsif ( $return->{status} ne "1" ) {
$values{result} = "Unspecified error";
$state = "unauthorized";
}
else {
$hash->{DEVICES} = join( ",", @{ $return->{devices} } );
$hash->{GROUP} = $return->{group};
}
readingsBulkUpdate( $hash, "devices", $devices )
if ( ReadingsVal($name,"devices","") ne $devices );
readingsBulkUpdate( $hash, "group", $group )
if ( ReadingsVal($name,"group","") ne $group );
}
# simple error handling if no JSON module was loaded
elsif ( $return !~ m/"status":1,/ ) {
$state = "unauthorized";
if ( $return =~ m/"errors":\[(.*)\]/ ) {
$values{result} = "Error: " . $1;
}
else {
$values{result} = "Unspecified error";
}
}
}
readingsBulkUpdate( $hash, "lastResult", $values{result} );
@ -502,25 +544,33 @@ sub Pushover_ReceiveCommand($$$) {
# Set reading for availability
#
my $available = 0;
$available = 1 if ( $state eq "connected" );
if ( !defined( $hash->{READINGS}{available}{VAL} )
|| $hash->{READINGS}{available}{VAL} ne $available )
{
readingsBulkUpdate( $hash, "available", $available );
}
if ($available eq "0") {
RemoveInternalTimer($hash);
InternalTimer( gettimeofday() + 900, "Pushover_ValidateUser", $hash, 0 )
}
$available = 1 if ( $param->{code} ne "429" && ($state eq "connected" || $state eq "error") );
readingsBulkUpdate( $hash, "available", $available )
if ( ReadingsVal($name,"available","") ne $available );
# Set reading for state
#
if ( !defined( $hash->{READINGS}{state}{VAL} )
|| $hash->{READINGS}{state}{VAL} ne $state )
{
readingsBulkUpdate( $hash, "state", $state );
readingsBulkUpdate( $hash, "state", $state )
if ( ReadingsVal($name,"state","") ne $state );
# credentials validation loop
#
my $nextTimer = "none";
# if we could not connect, try again in 5 minutes
if ($state eq "disconnected") {
$nextTimer = gettimeofday() + 300;
# re-validate every 6 hours if there was no message sent during that time
} elsif ($available eq "1") {
$nextTimer = gettimeofday() + 21600;
# re-validate after API limit was reset
} elsif ($state eq "limited" || $param->{code} == 429) {
$nextTimer = ReadingsVal($name,"apiReset",gettimeofday() + 21277) + 323;
}
RemoveInternalTimer($hash);
$hash->{VALIDATION_TIMER} = $nextTimer;
InternalTimer( $nextTimer, "Pushover_ValidateUser", $hash, 0 ) if ($nextTimer ne "none");
readingsEndUpdate( $hash, 1 );
@ -536,18 +586,18 @@ sub Pushover_ValidateUser ($;$) {
Log3 $name, 5, "Pushover $name: called function Pushover_ValidateUser()";
RemoveInternalTimer($hash);
if (ReadingsVal($name, "available", "0") ne "1") {
if ( AttrVal( $name, "disable", 0 ) == 1 ) {
$hash->{VALIDATION_TIMER} = "disabled";
RemoveInternalTimer($hash);
InternalTimer( gettimeofday() + 900, "Pushover_ValidateUser", $hash, 0 );
} else {
InternalTimer( gettimeofday() + 21600, "Pushover_ValidateUser", $hash, 0 );
return;
}
return
if ( AttrVal( $name, "disable", 0 ) == 1 );
if ( $device ne "" ) {
elsif ( $device ne "" ) {
Pushover_SendCommand( $hash, "users/validate.json", "device=$device" );
}
else {
Pushover_SendCommand( $hash, "users/validate.json" );
}
@ -730,7 +780,7 @@ sub Pushover_SetMessage {
$values{cbNr} = int( time() ) + $values{expire};
my $cbReading = "cb_" . $values{cbNr};
until ( !defined( $hash->{READINGS}{$cbReading}{VAL} ) ) {
until ( ReadingsVal($name, $cbReading, "") eq "" ) {
$values{cbNr}++;
$cbReading = "cb_" . $values{cbNr};
}
@ -798,11 +848,11 @@ sub Pushover_SetMessage {
. $hash->{NAME}
. " $key: time="
. $rBase[1] . " ack="
. $hash->{READINGS}{$rAck}{VAL}
. ReadingsVal($name, $rAck, "-")
. " curTime="
. int( time() );
if ( $hash->{READINGS}{$rAck}{VAL} == 1
if ( ReadingsVal($name, $rAck, 0) == 1
|| $rBase[1] <= int( time() ) )
{
delete $hash->{READINGS}{$key};
@ -922,7 +972,7 @@ sub Pushover_CGI() {
if ( !defined( $webArgs->{acknowledged_by} )
|| $webArgs->{acknowledged_by} ne $hash->{USER_KEY} );
if ( $hash->{READINGS}{$rAck}{VAL} == 0
if ( ReadingsVal($name, $rAck, 1) == 0
&& $rBase[1] > int( time() ) )
{
readingsBeginUpdate($hash);
@ -944,21 +994,19 @@ sub Pushover_CGI() {
my $redirect = "";
# run FHEM command if desired
if ( defined( $hash->{READINGS}{$rAct}{VAL} )
&& $hash->{READINGS}{$rAct}{VAL} !~ /^[\w-]+:\/\/.*$/ )
if ( ReadingsVal($name, $rAct, "pushover://") !~ /^[\w-]+:\/\/.*$/ )
{
$redirect = "pushover://";
fhem $hash->{READINGS}{$rAct}{VAL};
fhem ReadingsVal($name, $rAct, "");
readingsBulkUpdate( $hash, $rAct,
"executed: " . $hash->{READINGS}{$rAct}{VAL} );
"executed: " . ReadingsVal($name, $rAct, ""));
}
# redirect to presented URL
if ( defined( $hash->{READINGS}{$rAct}{VAL} )
&& $hash->{READINGS}{$rAct}{VAL} =~ /^[\w-]+:\/\/.*$/ )
if ( ReadingsVal($name, $rAct, "none") =~ /^[\w-]+:\/\/.*$/ )
{
$redirect = $hash->{READINGS}{$rAct}{VAL};
$redirect = ReadingsVal($name, $rAct, "");
}
readingsEndUpdate( $hash, 1 );

2269
fhem/FHEM/75_MSG.pm Normal file → Executable file

File diff suppressed because it is too large Load Diff

@ -1,7 +1,7 @@
# $Id$
##############################################################################
#
# 97_messageConfig.pm
# 97_msgConfig.pm
# Global configuration settings for FHEM msg command.
#
# Copyright by Julian Pawlowski
@ -36,16 +36,16 @@ package main;
use strict;
use warnings;
sub messageConfig_Set($@);
sub messageConfig_Define($$);
sub messageConfig_Undefine($$);
sub msgConfig_Set($@);
sub msgConfig_Define($$);
sub msgConfig_Undefine($$);
###################################
sub messageConfig_Initialize($) {
sub msgConfig_Initialize($) {
my ($hash) = @_;
$hash->{DefFn} = "messageConfig_Define";
$hash->{UndefFn} = "messageConfig_Undefine";
$hash->{DefFn} = "msgConfig_Define";
$hash->{UndefFn} = "msgConfig_Undefine";
# add attributes for configuration
no warnings 'qw';
@ -127,13 +127,13 @@ sub messageConfig_Initialize($) {
}
###################################
sub messageConfig_Define($$) {
sub msgConfig_Define($$) {
my ( $hash, $def ) = @_;
my @a = split( "[ \t]+", $def, 5 );
return "Usage: define <name> messageConfig"
return "Usage: define <name> msgConfig"
if ( int(@a) < 2 );
my $name = $a[0];
@ -152,7 +152,7 @@ sub messageConfig_Define($$) {
$attr{$name}{group} = $group;
$attr{$name}{verbose} = $verbose;
$attr{$name}{room} = $room if ($room ne "");
$attr{$name}{comment} = "FHEM Global Configuration for command 'message'";
$attr{$name}{comment} = "FHEM Global Configuration for command 'msg'";
$attr{$name}{stateFormat} = "fhemMsgState";
readingsBeginUpdate($hash);
@ -164,7 +164,7 @@ sub messageConfig_Define($$) {
}
###################################
sub messageConfig_Undefine($$) {
sub msgConfig_Undefine($$) {
my ( $hash, $name ) = @_;
@ -181,19 +181,19 @@ sub messageConfig_Undefine($$) {
=begin html
<p>
<a name="messageConfig" id="messageConfig"></a>
<a name="msgConfig" id="msgConfig"></a>
</p>
<h3>
messageConfig
msgConfig
</h3>
<ul>
<li>Provides global settings for FHEM command <a href="#message">message</a>.<br>
<li>Provides global settings for FHEM command <a href="#MSG">msg</a>.<br>
<br>
</li>
<li>
<a name="messageConfigdefine" id="messageConfigdefine"></a> <b>Define</b>
<a name="msgConfigdefine" id="msgConfigdefine"></a> <b>Define</b>
<div style="margin-left: 2em">
<code>define &lt;name&gt; messageConfig</code><br>
<code>define &lt;name&gt; msgConfig</code><br>
</div>
</li>
</ul>
@ -203,19 +203,19 @@ sub messageConfig_Undefine($$) {
=begin html_DE
<p>
<a name="messageConfig" id="messageConfig"></a>
<a name="msgConfig" id="msgConfig"></a>
</p>
<h3>
messageConfig
msgConfig
</h3>
<ul>
<li>Stellt globale Einstellungen für das FHEM Kommando <a href="#message">message</a> bereit.<br>
<li>Stellt globale Einstellungen für das FHEM Kommando <a href="#MSG">msg</a> bereit.<br>
<br>
</li>
<li>
<a name="messageConfigdefine" id="messageConfigdefine"></a> <b>Define</b>
<a name="msgConfigdefine" id="msgConfigdefine"></a> <b>Define</b>
<div style="margin-left: 2em">
<code>define &lt;name&gt; messageConfig</code><br>
<code>define &lt;name&gt; msgConfig</code><br>
</div>
</li>
</ul>

@ -1,7 +1,7 @@
# $Id$
##############################################################################
#
# messageSchema.pm
# msgSchema.pm
# Schema database for FHEM modules and their messaging options.
# These commands are being used as default setting for FHEM command 'msg'
# unless there is an explicit msgCmd* attribute.
@ -28,7 +28,7 @@
#
##############################################################################
package messageSchema;
package msgSchema;
use strict;
use warnings;

@ -618,7 +618,7 @@
- added new RESIDENTS toolkit functions for RESIDENTS, ROOMMMATE and GUEST devices
first function: wakeuptimer
- Thu Mar 13 2015 (loredo)
- Thu Mar 13 2015 (chris1284)
- fixed CALVIEW commandref (ms to sec)
- Tue Mar 17 2015 (wzut)
@ -637,5 +637,9 @@
- Mon Aug 23 2015 (rapster)
- added new module 74_Unifi for the Ubiquiti Networks (UBNT) - Unifi Controller.
- Wed Okt 21 2015 (sidey)
- Wed Oct 21 2015 (sidey)
- added new module 00_SIGNALduino, 90_SIGNALduino_un, 14_Hideki, 14_SD_WS07
- Thu Nov 3 2015 (loredo)
- removed deprecated wrapper module 75_MSG.pm. Users will need to replace device definitions by 75_MSGFile.pm or 75_MSGMail.pm respectively.
- added new FHEM command 'msg' to introduce integrated message routing functionality

@ -231,7 +231,8 @@ FHEM/73_PRESENCE.pm markusbloch http://forum.fhem.de Unterstue
FHEM/73_MPD.pm Wzut http://forum.fhem.de Multimedia
FHEM/74_AMAD.pm CoolTux http://forum.fhem.de Unterstuetzende Dienste
FHEM/74_Unifi.pm rapster http://forum.fhem.de Automatisierung
FHEM/75_MSG.pm gandy http://forum.fhem.de Automatisierung
FHEM/75_MSG.pm loredo http://forum.fhem.de Automatisierung
FHEM/75_msgConfig.pm loredo http://forum.fhem.de Automatisierung
FHEM/76_MSGFile.pm gandy http://forum.fhem.de Automatisierung
FHEM/76_MSGMail.pm gandy http://forum.fhem.de Automatisierung
FHEM/80_M232.pm borisneubert http://forum.fhem.de Sonstige Systeme
@ -321,6 +322,7 @@ FHEM/FritzBoxUtils.pm rudolfkoenig http://forum.fhem.de FRITZ!Box
FHEM/HMConfig.pm martinp876 http://forum.fhem.de HomeMatic
FHEM/HttpUtils.pm rudolfkoenig http://forum.fhem.de Automatisierung
FHEM/MaxCommon.pm mgehre http://forum.fhem.de MAX
FHEM/msgSchema.pm loredo http://forum.fhem.de Automatisierung
FHEM/ONKYOdb.pm loredo http://forum.fhem.de Multimedia
FHEM/OWX_DS2480.pm ntruchsess http://forum.fhem.de 1Wire
FHEM/OWX_DS9097.pm ntruchsess http://forum.fhem.de 1Wire

File diff suppressed because it is too large Load Diff