Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
91110ea98b | |||
4df083cbf9 | |||
b9708a909d | |||
9727c85bde | |||
552efdf558 | |||
2ec50eaec3 | |||
73fcfb63d9 | |||
f2fe1ee8be | |||
bb9705ef8b | |||
2513af243b | |||
92d42b2e19 |
87
74_HOMBOT.pm
87
74_HOMBOT.pm
@ -35,7 +35,7 @@ use Time::HiRes qw(gettimeofday);
|
|||||||
use HttpUtils;
|
use HttpUtils;
|
||||||
use Blocking;
|
use Blocking;
|
||||||
|
|
||||||
my $version = "0.1.60";
|
my $version = "0.2.5";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -48,6 +48,7 @@ sub HOMBOT_Initialize($) {
|
|||||||
$hash->{DefFn} = "HOMBOT_Define";
|
$hash->{DefFn} = "HOMBOT_Define";
|
||||||
$hash->{UndefFn} = "HOMBOT_Undef";
|
$hash->{UndefFn} = "HOMBOT_Undef";
|
||||||
$hash->{AttrFn} = "HOMBOT_Attr";
|
$hash->{AttrFn} = "HOMBOT_Attr";
|
||||||
|
$hash->{FW_detailFn} = "HOMBOT_DetailFn";
|
||||||
|
|
||||||
$hash->{AttrList} = "interval ".
|
$hash->{AttrList} = "interval ".
|
||||||
"disable:1 ".
|
"disable:1 ".
|
||||||
@ -67,7 +68,13 @@ sub HOMBOT_Define($$) {
|
|||||||
|
|
||||||
my @a = split( "[ \t][ \t]*", $def );
|
my @a = split( "[ \t][ \t]*", $def );
|
||||||
|
|
||||||
|
|
||||||
return "too few parameters: define <name> HOMBOT <HOST>" if( @a != 3 );
|
return "too few parameters: define <name> HOMBOT <HOST>" if( @a != 3 );
|
||||||
|
return "please check if ssh installed" unless( -X "/usr/bin/ssh" );
|
||||||
|
return "please check if $attr{global}{modpath}/.ssh/known_hosts or /root/.ssh/known_hosts exist" unless( -R "$attr{global}{modpath}/.ssh/known_hosts" or -R "/root/.ssh/known_hosts" );
|
||||||
|
return "please check if sshpass installed" unless( -X "/usr/bin/sshpass" or -X "/usr/local/bin/sshpass" );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
my $name = $a[0];
|
my $name = $a[0];
|
||||||
my $host = $a[2];
|
my $host = $a[2];
|
||||||
@ -80,6 +87,8 @@ sub HOMBOT_Define($$) {
|
|||||||
$hash->{VERSION} = $version;
|
$hash->{VERSION} = $version;
|
||||||
$hash->{helper}{requestErrorCounter} = 0;
|
$hash->{helper}{requestErrorCounter} = 0;
|
||||||
$hash->{helper}{setErrorCounter} = 0;
|
$hash->{helper}{setErrorCounter} = 0;
|
||||||
|
$hash->{helper}{sshpass} = "/usr/bin/sshpass";
|
||||||
|
$hash->{helper}{sshpass} = "/usr/local/bin/sshpass" unless( -X "/usr/bin/sshpass");
|
||||||
|
|
||||||
|
|
||||||
Log3 $name, 3, "HOMBOT ($name) - defined with host $hash->{HOST} on port $hash->{PORT} and interval $hash->{INTERVAL} (sec)";
|
Log3 $name, 3, "HOMBOT ($name) - defined with host $hash->{HOST} on port $hash->{PORT} and interval $hash->{INTERVAL} (sec)";
|
||||||
@ -228,8 +237,8 @@ sub HOMBOT_getStatusTXT($) {
|
|||||||
doTrigger => 1,
|
doTrigger => 1,
|
||||||
callback => \&HOMBOT_RetrieveHomebotInfoFinished,
|
callback => \&HOMBOT_RetrieveHomebotInfoFinished,
|
||||||
id => "statustxt",
|
id => "statustxt",
|
||||||
}
|
});
|
||||||
);
|
|
||||||
Log3 $name, 4, "HOMBOT ($name) - NonblockingGet get URL";
|
Log3 $name, 4, "HOMBOT ($name) - NonblockingGet get URL";
|
||||||
Log3 $name, 4, "HOMBOT ($name) - HOMBOT_Retrieve status.txt Information: calling Host: $host";
|
Log3 $name, 4, "HOMBOT ($name) - HOMBOT_Retrieve status.txt Information: calling Host: $host";
|
||||||
}
|
}
|
||||||
@ -254,8 +263,8 @@ sub HOMBOT_getStatisticHTML($) {
|
|||||||
doTrigger => 1,
|
doTrigger => 1,
|
||||||
callback => \&HOMBOT_RetrieveHomebotInfoFinished,
|
callback => \&HOMBOT_RetrieveHomebotInfoFinished,
|
||||||
id => "statistichtml",
|
id => "statistichtml",
|
||||||
}
|
});
|
||||||
);
|
|
||||||
Log3 $name, 4, "HOMBOT ($name) - NonblockingGet get URL";
|
Log3 $name, 4, "HOMBOT ($name) - NonblockingGet get URL";
|
||||||
Log3 $name, 4, "HOMBOT ($name) - HOMBOT_Retrieve statistic.html Information: calling Host: $host";
|
Log3 $name, 4, "HOMBOT ($name) - HOMBOT_Retrieve statistic.html Information: calling Host: $host";
|
||||||
}
|
}
|
||||||
@ -280,8 +289,8 @@ sub HOMBOT_getSchedule($) {
|
|||||||
doTrigger => 1,
|
doTrigger => 1,
|
||||||
callback => \&HOMBOT_RetrieveHomebotInfoFinished,
|
callback => \&HOMBOT_RetrieveHomebotInfoFinished,
|
||||||
id => "schedule",
|
id => "schedule",
|
||||||
}
|
});
|
||||||
);
|
|
||||||
Log3 $name, 4, "HOMBOT ($name) - NonblockingGet get URL";
|
Log3 $name, 4, "HOMBOT ($name) - NonblockingGet get URL";
|
||||||
Log3 $name, 4, "HOMBOT ($name) - HOMBOT_Retrieve Schedule Information: calling Host: $host";
|
Log3 $name, 4, "HOMBOT ($name) - HOMBOT_Retrieve Schedule Information: calling Host: $host";
|
||||||
}
|
}
|
||||||
@ -304,7 +313,6 @@ sub HOMBOT_RetrieveHomebotInfoFinished($$$) {
|
|||||||
|
|
||||||
readingsSingleUpdate( $hash, "lastStatusRequestState", "statusRequest_error", 1 );
|
readingsSingleUpdate( $hash, "lastStatusRequestState", "statusRequest_error", 1 );
|
||||||
|
|
||||||
|
|
||||||
if( $hash->{helper}{requestErrorCounter} > 1 && ReadingsVal( $name, "luigiHttpSrvState", "not running" ) eq "running" ) {
|
if( $hash->{helper}{requestErrorCounter} > 1 && ReadingsVal( $name, "luigiHttpSrvState", "not running" ) eq "running" ) {
|
||||||
|
|
||||||
Log3 $name, 3, "HOMBOT ($name) - Connecting Problem, will check Luigi HTTP Server" unless(exists($hash->{helper}{RUNNING_PID}));
|
Log3 $name, 3, "HOMBOT ($name) - Connecting Problem, will check Luigi HTTP Server" unless(exists($hash->{helper}{RUNNING_PID}));
|
||||||
@ -352,7 +360,9 @@ sub HOMBOT_RetrieveHomebotInfoFinished($$$) {
|
|||||||
readingsBulkUpdate ( $hash, "state", "To many Errors");
|
readingsBulkUpdate ( $hash, "state", "To many Errors");
|
||||||
$hash->{helper}{requestErrorCounter} = 0;
|
$hash->{helper}{requestErrorCounter} = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
readingsEndUpdate( $hash, 1 );
|
readingsEndUpdate( $hash, 1 );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( defined( $err ) && $err ne "" ) {
|
if( defined( $err ) && $err ne "" ) {
|
||||||
@ -452,11 +462,18 @@ sub HOMBOT_RetrieveHomebotInfoFinished($$$) {
|
|||||||
$t =~ s/JSON_TURBO/turbo/g;
|
$t =~ s/JSON_TURBO/turbo/g;
|
||||||
$t =~ s/JSON_ROBOT_STATE/hombotState/g;
|
$t =~ s/JSON_ROBOT_STATE/hombotState/g;
|
||||||
$t =~ s/CLREC_CURRENTBUMPING/currentBumping/g;
|
$t =~ s/CLREC_CURRENTBUMPING/currentBumping/g;
|
||||||
$t =~ s/CLREC_LAST_CLEAN/lastClean/g;
|
|
||||||
|
if( $t eq "CLREC_LAST_CLEAN" ) {
|
||||||
|
my @lctime = split( '/' , $v );
|
||||||
|
$v = $lctime[2].".".$lctime[1].".".$lctime[0]." ".$lctime[3].":".$lctime[4];
|
||||||
|
$t = "lastClean";
|
||||||
|
}
|
||||||
|
|
||||||
$t =~ s/JSON_BATTPERC/batteryPercent/g;
|
$t =~ s/JSON_BATTPERC/batteryPercent/g;
|
||||||
$t =~ s/JSON_VERSION/firmware/g;
|
$t =~ s/JSON_VERSION/firmware/g;
|
||||||
$t =~ s/LGSRV_VERSION/luigiSrvVersion/g;
|
$t =~ s/LGSRV_VERSION/luigiSrvVersion/g;
|
||||||
|
|
||||||
|
|
||||||
readingsBulkUpdate( $hash, $t, $v ) if( $t =~ m/[a-z]/s && defined( $t ) && defined( $v ) );
|
readingsBulkUpdate( $hash, $t, $v ) if( $t =~ m/[a-z]/s && defined( $t ) && defined( $v ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -544,8 +561,8 @@ sub HOMBOT_Set($$@) {
|
|||||||
$list .= "cleanMode:SB,ZZ,SPOT ";
|
$list .= "cleanMode:SB,ZZ,SPOT ";
|
||||||
$list .= "repeat:true,false ";
|
$list .= "repeat:true,false ";
|
||||||
$list .= "turbo:true,false ";
|
$list .= "turbo:true,false ";
|
||||||
$list .= "nickname " ;
|
$list .= "nickname ";
|
||||||
$list .= "schedule " ;
|
$list .= "schedule ";
|
||||||
|
|
||||||
|
|
||||||
if( lc $cmd eq 'cleanstart'
|
if( lc $cmd eq 'cleanstart'
|
||||||
@ -568,7 +585,7 @@ sub HOMBOT_Set($$@) {
|
|||||||
return "set command only works if state not equal initialized, please wait for next interval run" if( ReadingsVal( $hash->{NAME}, "state", 0 ) eq "initialized");
|
return "set command only works if state not equal initialized, please wait for next interval run" if( ReadingsVal( $hash->{NAME}, "state", 0 ) eq "initialized");
|
||||||
return "to many character for Nickname" if(( $wordlenght < 2 || $wordlenght > 16 ) && lc $cmd eq 'nickname' );
|
return "to many character for Nickname" if(( $wordlenght < 2 || $wordlenght > 16 ) && lc $cmd eq 'nickname' );
|
||||||
|
|
||||||
return HOMBOT_SelectSetCmd( $hash, $cmd, @val ) if( ( ( @val ) && lc $cmd eq 'statusrequest' || lc $cmd eq 'cleanstart'|| lc $cmd eq 'homing' || lc $cmd eq 'pause' ) );
|
return HOMBOT_SelectSetCmd( $hash, $cmd, @val ) if( ( ( @val ) || lc $cmd eq 'cleanstart'|| lc $cmd eq 'homing' || lc $cmd eq 'pause' ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
return "Unknown argument $cmd, bearword as argument or wrong parameter(s), choose one of $list";
|
return "Unknown argument $cmd, bearword as argument or wrong parameter(s), choose one of $list";
|
||||||
@ -697,8 +714,8 @@ sub HOMBOT_HTTP_POST($$) {
|
|||||||
method => "GET",
|
method => "GET",
|
||||||
doTrigger => 1,
|
doTrigger => 1,
|
||||||
callback => \&HOMBOT_HTTP_POSTerrorHandling,
|
callback => \&HOMBOT_HTTP_POSTerrorHandling,
|
||||||
}
|
});
|
||||||
);
|
|
||||||
Log3 $name, 4, "HOMBOT ($name) - Send HTTP POST with URL $url";
|
Log3 $name, 4, "HOMBOT ($name) - Send HTTP POST with URL $url";
|
||||||
|
|
||||||
readingsSingleUpdate( $hash, "state", $state, 1 );
|
readingsSingleUpdate( $hash, "state", $state, 1 );
|
||||||
@ -762,6 +779,7 @@ sub HOMBOT_HTTP_POSTerrorHandling($$$) {
|
|||||||
$hash->{helper}{setErrorCounter} = 0;
|
$hash->{helper}{setErrorCounter} = 0;
|
||||||
$hash->{helper}{requestErrorCounter} = 0;
|
$hash->{helper}{requestErrorCounter} = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
readingsEndUpdate( $hash, 1 );
|
readingsEndUpdate( $hash, 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -832,19 +850,20 @@ sub HOMBOT_Check_Bot_Alive($) {
|
|||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
my $host = $hash->{HOST};
|
my $host = $hash->{HOST};
|
||||||
my $sshalive;
|
my $sshalive;
|
||||||
|
my $sshpass = $hash->{helper}{sshpass};
|
||||||
|
|
||||||
Log3 $name, 3, "HOMBOT ($name) - Start SSH Connection for check Hombot alive";
|
Log3 $name, 3, "HOMBOT ($name) - Start SSH Connection for check Hombot alive";
|
||||||
|
|
||||||
|
|
||||||
$sshalive = qx(/usr/bin/sshpass -p 'most9981' /usr/bin/ssh root\@$host 'uname' );
|
$sshalive = qx($sshpass -p 'most9981' /usr/bin/ssh root\@$host 'uname' );
|
||||||
|
|
||||||
if( $sshalive ) {
|
if( $sshalive ) {
|
||||||
|
|
||||||
my $lgSrvPID = ((split (/\s+/,qx(/usr/bin/sshpass -p 'most9981' /usr/bin/ssh root\@$host 'ps | grep -v grep | grep /usr/bin/lg.srv' )))[1]);
|
my $lgSrvPID = ((split (/\s+/,qx($sshpass -p 'most9981' /usr/bin/ssh root\@$host 'ps | grep -v grep | grep /usr/bin/lg.srv' )))[1]);
|
||||||
|
|
||||||
if( not defined( $lgSrvPID ) ) {
|
if( not defined( $lgSrvPID ) ) {
|
||||||
|
|
||||||
qx(/usr/bin/sshpass -p 'most9981' /usr/bin/ssh root\@$host '/usr/bin/lg.srv &' );
|
qx($sshpass -p 'most9981' /usr/bin/ssh root\@$host '/usr/bin/lg.srv &' );
|
||||||
|
|
||||||
return "$name|$callingtype|restarted";
|
return "$name|$callingtype|restarted";
|
||||||
|
|
||||||
@ -959,6 +978,16 @@ sub HOMBOT_Aborted_Bot_Alive($) {
|
|||||||
Log3 $name, 3, "HOMBOT ($name) - The BlockingCall Process terminated unexpectedly. Timedout";
|
Log3 $name, 3, "HOMBOT ($name) - The BlockingCall Process terminated unexpectedly. Timedout";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub HOMBOT_DetailFn() { # Patch von Andre (justme1968)
|
||||||
|
|
||||||
|
my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn.
|
||||||
|
my $hash = $defs{$d};
|
||||||
|
|
||||||
|
return if( !defined( $hash->{HOST} ) );
|
||||||
|
|
||||||
|
return "<b><u><a href=\"http://$hash->{HOST}:6260\" target=\"_blank\">Control Center</a></u></b><br>"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -968,6 +997,8 @@ sub HOMBOT_Aborted_Bot_Alive($) {
|
|||||||
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
=item summary connection to LG Homebot robotic vacuum cleaner
|
||||||
|
=item summary_DE Anbindung LG Homebot Staubsaugerroboter
|
||||||
=begin html
|
=begin html
|
||||||
|
|
||||||
<a name="HOMBOT"></a>
|
<a name="HOMBOT"></a>
|
||||||
@ -1056,21 +1087,23 @@ sub HOMBOT_Aborted_Bot_Alive($) {
|
|||||||
<ul>
|
<ul>
|
||||||
<u><b>HOMBOT - LG Homebot Staubsaugerroboter</b></u>
|
<u><b>HOMBOT - LG Homebot Staubsaugerroboter</b></u>
|
||||||
<br>
|
<br>
|
||||||
Dieses Modul gibt Euch die Möglichkeit Euren Hombot nach erfolgreichen Hack in FHEM ein zu binden.
|
Dieses Modul gibt Euch die Möglichkeit Euren Hombot nach erfolgreichen Hack in FHEM ein zu binden.
|
||||||
Voraussetzung ist das Ihr den Hombot Hack gemacht und einen WLAN Stick eingebaut habt. Als Schnittstelle zwischen FHEM und Bot wird der Luigi HTTP Server verwendet. Was genau könnt Ihr nun mit dem Modul machen:
|
Voraussetzung ist das Ihr den Hombot Hack gemacht und einen WLAN Stick eingebaut habt. Als Schnittstelle zwischen FHEM und Bot wird der Luigi HTTP Server verwendet. Was genau könnt Ihr nun mit dem Modul machen:
|
||||||
<ul>
|
<ul>
|
||||||
<li>Readings über den Status des Hombots werden angelegt</li>
|
<li>Readings über den Status des Hombots werden angelegt</li>
|
||||||
<li>Auswahl des Reinigungsmodus ist möglich</li>
|
<li>Auswahl des Reinigungsmodus ist möglich</li>
|
||||||
<li>Starten der Reinigung</li>
|
<li>Starten der Reinigung</li>
|
||||||
<li>Beenden der Reinigung</li>
|
<li>Beenden der Reinigung</li>
|
||||||
<li>zurück zur Homebase schicken</li>
|
<li>zurück zur Homebase schicken</li>
|
||||||
<li>Namen vergeben</li>
|
<li>Namen vergeben</li>
|
||||||
<li>Wochenprogramm einstellen</li>
|
<li>Wochenprogramm einstellen</li>
|
||||||
<li>Repeat und Turbo aktivieren</li>
|
<li>Repeat und Turbo aktivieren</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
Das Device für den Hombot legt Ihr wie folgt in FHEM an.
|
!!! Voraussetzungen schaffen !!!
|
||||||
|
<br>Ihr benötigt zum verwenden des Modules die Programme ssh und sshpass. Desweiteren muß im Homeverzeichnis des fhem Users das Verzeichniss .ssh existieren und darin die Datei known_hosts. Diese sollte eine Passphrass des Bots beinhalten. Am besten Ihr macht als normaler User eine ssh Session zum Bot und kopiert danach die known_hosts Eures normalen Users in das .ssh Verzeichnis des fhem Users. Rechte anpassen nicht vergessen.
|
||||||
|
<br>
|
||||||
|
Das Device für den Hombot legt Ihr wie folgt in FHEM an.
|
||||||
<br><br>
|
<br><br>
|
||||||
<a name="HOMBOTdefine"></a>
|
<a name="HOMBOTdefine"></a>
|
||||||
<b>Define</b>
|
<b>Define</b>
|
||||||
@ -1092,10 +1125,10 @@ sub HOMBOT_Aborted_Bot_Alive($) {
|
|||||||
<a name="HOMBOTreadings"></a>
|
<a name="HOMBOTreadings"></a>
|
||||||
<b>Readings</b>
|
<b>Readings</b>
|
||||||
<ul>
|
<ul>
|
||||||
<li>at_* - Reading für das Wochenprogramm. Startzeit für den jeweiligen Tag</li>
|
<li>at_* - Reading für das Wochenprogramm. Startzeit für den jeweiligen Tag</li>
|
||||||
<li>batteryPercent - Status der Batterie in %</li>
|
<li>batteryPercent - Status der Batterie in %</li>
|
||||||
<li>cleanMode - aktuell eingestellter Reinigungsmodus</li>
|
<li>cleanMode - aktuell eingestellter Reinigungsmodus</li>
|
||||||
<li>cpu_* - Informationen über die Prozessorauslastung</li>
|
<li>cpu_* - Informationen über die Prozessorauslastung</li>
|
||||||
<li>currentBumping - Anzahl der Zusammenstöße mit Hindernissen</li>
|
<li>currentBumping - Anzahl der Zusammenstöße mit Hindernissen</li>
|
||||||
<li>firmware - aktuell installierte Firmwareversion</li>
|
<li>firmware - aktuell installierte Firmwareversion</li>
|
||||||
<li>hombotState - Status des Hombots</li>
|
<li>hombotState - Status des Hombots</li>
|
||||||
@ -1119,7 +1152,7 @@ sub HOMBOT_Aborted_Bot_Alive($) {
|
|||||||
<li>cleanStart - Reinigung starten</li>
|
<li>cleanStart - Reinigung starten</li>
|
||||||
<li>homing - Beendet die Reinigung und lässt die Bot zurück zur Bases kommen</li>
|
<li>homing - Beendet die Reinigung und lässt die Bot zurück zur Bases kommen</li>
|
||||||
<li>nickname - setzt des Bot-Namens. Wird im Reading erst nach einem neustart des Luigiservers oder des Bots sichtbar</li>
|
<li>nickname - setzt des Bot-Namens. Wird im Reading erst nach einem neustart des Luigiservers oder des Bots sichtbar</li>
|
||||||
<li>pause - lässt den Reinigungsproßess pausieren</li>
|
<li>pause - lässt den Reinigungsproßess pausieren</li>
|
||||||
<li>repeat - Reinigung wiederholen? (true/false)</li>
|
<li>repeat - Reinigung wiederholen? (true/false)</li>
|
||||||
<li>schedule - setzen des Wochenprogrammes Bsp. set Roberta schedule Mo=13:30 Di= Mi=14:00,ZZ Do=15:20 Fr= Sa=11:20 So= Man kann also auch den Modus mitgeben!</li>
|
<li>schedule - setzen des Wochenprogrammes Bsp. set Roberta schedule Mo=13:30 Di= Mi=14:00,ZZ Do=15:20 Fr= Sa=11:20 So= Man kann also auch den Modus mitgeben!</li>
|
||||||
<li>statusRequest - Fordert einen neuen Statusreport beim Device an</li>
|
<li>statusRequest - Fordert einen neuen Statusreport beim Device an</li>
|
||||||
|
Reference in New Issue
Block a user