From ef39ae086c4ed3562081dad5b79aaa05dee1dda1 Mon Sep 17 00:00:00 2001 From: Marko Oldenburg Date: Mon, 16 Jan 2017 13:26:35 +0100 Subject: [PATCH] first initial --- 21_HEOSMaster.pm | 189 +++++++++++++++++++++++++++++++++++++++++++++++ 21_HEOSPlayer.pm | 0 2 files changed, 189 insertions(+) create mode 100644 21_HEOSMaster.pm create mode 100644 21_HEOSPlayer.pm diff --git a/21_HEOSMaster.pm b/21_HEOSMaster.pm new file mode 100644 index 0000000..dfa338e --- /dev/null +++ b/21_HEOSMaster.pm @@ -0,0 +1,189 @@ +############################################################################### +# +# Developed with Kate +# +# (c) 2017 Copyright: Marko Oldenburg (leongaultier at gmail dot com) +# All rights reserved +# +# This script is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# $Id$ +# +############################################################################### + +################################# +######### Wichtige Hinweise und Links ################# + + +## +# + + +################################ + + +package main; + +use strict; +use warnings; + +use JSON; + +use IO::Socket::INET; + + +my $version = "0.0.1"; + + + +# Declare functions +sub HEOSMaster_Initialize($); +sub HEOSMaster_Define($$); +sub HEOSMaster_Undef($$); +sub HEOSMaster_Set($@); + +# Subprocess functions +sub HEOSMaster_firstConnect($); + + + +sub HEOSMaster_Initialize($) { + + my ($hash) = @_; + + # Provider + $hash->{ReadFn} = "HEOSMaster_Read"; + #$hash->{WriteFn} = "HEOSMaster_Read"; + #$hash->{Clients} = ":HEOSPlayer:"; + + + # Consumer + $hash->{SetFn} = "HEOSMaster_Set"; + #$hash->{GetFn} = "HEOSMaster_Get"; + $hash->{DefFn} = "HEOSMaster_Define"; + $hash->{UndefFn} = "HEOSMaster_Undef"; + #$hash->{AttrFn} = "HEOSMaster_Attr"; + #$hash->{AttrList} = "disable:1 ". + # $readingFnAttributes; + + + foreach my $d(sort keys %{$modules{HEOSMaster}{defptr}}) { + my $hash = $modules{HEOSMaster}{defptr}{$d}; + $hash->{VERSION} = $version; + } +} + +sub HEOSMaster_Define($$) { + + my ( $hash, $def ) = @_; + + my @a = split( "[ \t][ \t]*", $def ); + + + return "too few parameters: define HEOSMaster " if( @a != 3 ); + + + + my $name = $a[0]; + my $host = $a[2]; + + $hash->{HOST} = $host; + $hash->{VERSION} = $version; + + + Log3 $name, 3, "HEOSMaster ($name) - defined with host $host"; + + $attr{$name}{room} = "HEOS" if( !defined( $attr{$name}{room} ) ); + readingsSingleUpdate($hash, 'state', 'Initialized', 1 ); + + + $modules{HEOSMaster}{defptr}{$hash->{HOST}} = $hash; + + return undef; +} + +sub HEOSMaster_Undef($$) { + + my ( $hash, $arg ) = @_; + + my $host = $hash->{HOST}; + my $name = $hash->{NAME}; + + + delete $modules{HEOSMaster}{defptr}{$hash->{HOST}}; + + return undef; +} + +sub HEOSMaster_Set($@) { + + my ($hash, $name, $cmd, @args) = @_; + my ($arg, @params) = @args; + + + if($cmd eq 'startFirstConnect') { + return "usage: startFirstConnect" if( @args != 0 ); + + HEOSMaster_firstConnect($hash); + + return undef; + + } else { + my $list = ""; + $list .= "startFirstConnect:noArg"; + return "Unknown argument $cmd, choose one of $list"; + } +} + +sub HEOSMaster_firstConnect($) { + + my $hash = shift; + my $name = $hash->{NAME}; + my $host = $hash->{HOST}; + my $port = 1255; + my $timeout = 5; + my $msg; + + Log3 $name, 3, "HEOSMaster ($name) - Baue Socket Verbindung auf"; + + my $socket = IO::Socket::INET->new(PeerAddr => $host, + PeerPort => $port, + Proto => 'tcp', + Type => SOCK_STREAM, + Timeout => $timeout ) + or return Log3 $name, 3, "HEOSMaster ($name) Couldn't connect to $host:$port"; + + $socket->send('heos://player/get_players'); + + my $data; + my $retval = $socket->recv($data,8192); + + $socket->close(); + + unless( defined $retval) { + Log3 $name, 3, "HEOSMaster ($name) - Keine Daten empfangen"; + return undef; + } + + Log3 $name, 3, "HEOSMaster ($name) - Daten: $data"; +} + + + + + +1; diff --git a/21_HEOSPlayer.pm b/21_HEOSPlayer.pm new file mode 100644 index 0000000..e69de29