FHEM -> Samsung TV mit Tizen

Begonnen von Florian_GT, 12 September 2016, 00:15:35

Vorheriges Thema - Nächstes Thema

KölnSolar

#120
ja geil, guck mal mein edit einen post vorher  :o

Dann würd ich sagen Planänderung und einfach mal meine angehängte modifizierte STV nehmen. Vorher die alte Version sichern, denn meine hat eine "keineAhnungvonwann-Basisversion" und ist auch nicht für den problemlosen universellen Betrieb geeignet, also NUR für die jetzigen Tests.

Edit: Mist, hatte die IP hart codiert. Schick mir bitte ne PN mit der IP des FHEM-Servers und Deine email dann baue ich morgen um und schicke Dir die Version per Mail.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Gigafix

Hallo KölnSolar

Zitat von: KölnSolar am 28 Oktober 2017, 18:23:45
OK, Power on ging noch nie, bei keiner Serie. Grund: keine Netzwerkverbindung  ;)

Ich habe das Power on bei meinem KS9090 so gelöst:
{system (qx(etherwake -i eth0 5c:49:7d:0a:83:7c))}

Der TV hängt allerdings auch am Lan-Kabel. Kannst Du ja bei Dir mal testen - natürlich mit Deiner MAC-Adresse...

Grüße sendet
Gigafix
VM Synology DS918 | CubieTruck |2x HMLAN | HMUSB | 3x HMWLAN | CCU2 | MAX-Cube | nanoCUL | ZWDongle |

docb

Tip top,
ich habe das gleichmal mit dem WOL Modul eingebaut und schon funktioniert ein- und ausschalten ;-)
I love FHEM ;-)

Hier mal mein Device falls das jemand nachbauen will - natürlich MAC und IP in der DEF durch eigene Werte ersetzen und beim attr shutdowncmd den Namen des eigenen devices reinsetzen (bei mir heißt er halt TV_Samsung).

Internals:
   CFGFN
   DEF        MAC IP
   IP         IP
   MAC        MAC
   MODE       BOTH
   NAME       TVSamsung_wol
   NR         14000
   REPEAT     000
   STATE      on
   TYPE       WOL
   READINGS:
     2017-10-29 09:54:50   active          off
     2017-10-29 09:52:12   isRunning       true
     2017-10-29 09:52:08   packet_via_EW   MAC
     2017-10-29 09:52:08   packet_via_UDP  IP
     2017-10-29 09:52:12   state           on
   TIMER:
     TVSamsung_wol_ping:
       HASH       TVSamsung_wol
       MODIFIER   ping
       NAME       TVSamsung_wol_ping
   helper:
Attributes:
   shutdownCmd set TV_Samsung POWER
I love FHEM!

KölnSolar

docb, Du denkst an die PN(s.o) ?

@Gigafix Danke für den Hinweis. Probier ich bestimmt noch  ;) Ich hab den Workaround: Strom an/Strom aus  ;D
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

docb

Die PN ist heute früh schon raus.
Und noch ein Workaround: harmony. Mit dem Ding schalte ich alles, was sonst nicht will ;-)
I love FHEM!

KölnSolar

Da halt ich mit der Betty dagegen  ;)
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

theophilou85

#126
Habe jetzt dank PN von docb folgendes gemacht:

- sudo pip install websocket-client
- sudo pip install samsungctl
- File /usr/local/lib/python2.7/dist-packages/samsungctl/__main__.py öffnen
    o except FileNotFoundError: in except: ändern (<----war bei mir nicht vorhanden)
    o Folgende Zeile löschen directories.append(os.path.join(os.getenv("HOME"), ".config")) (<----war bei mir auch nicht vorhanden)

Die 70_STV.pm ins Verzeichnis FHEM.
Und das hier in die fhem.cfg:

define tv00 STV 192.168.0.203 ws

define tv00_wol WOL e4:7d:bd:98:60:38 192.168.0.203
attr tv00_wol shutdownCmd POWER

Das Device tv00 ist dann zwar "Initialized" aber reagiert auf keinen Befehl. Habe auch die Ports 7676 und 8001 versucht, aber in beiden Fällen meckert FHEM "STV Port not supported".
hiermit: http://192.168.0.203:8001/api/v2/ komme ich an den TV der übrigens ein "modelName": "UE55KU6170", ist.
Kann mir jemand helfen?


docb

Puh, ich bin da leider ratlos - die beiden Zeilen müssen eigentlich vorhanden sein. Hast du manuell oder mit Suchfunktion gesucht? Bei mir waren beide da. Daran hängt sicher der Fehler. Installiere doch beides einfach nochmal neu.
I love FHEM!

theophilou85

import argparse
import collections
import json
import logging
import os
import socket
import errno

from . import __doc__ as doc
from . import __title__ as title
from . import __version__ as version
from . import exceptions
from . import Remote

def _read_config():
    config = collections.defaultdict(lambda: None, {
        "name": "samsungctl",
        "description": "PC",
        "id": "",
        "method": "legacy",
        "timeout": 0,
    })

    file_loaded = False
    directories = []

    xdg_config = os.getenv("XDG_CONFIG_HOME")
    if xdg_config:
        directories.append(xdg_config)

    directories.append(os.path.join(os.getenv("HOME"), ".config"))
    directories.append("/etc")

    for directory in directories:
        path = os.path.join(directory, "samsungctl.conf")
        try:
            config_file = open(path)
        except IOError as e:
            if e.errno == errno.ENOENT:
                continue
            else:
                raise
        else:
            file_loaded = True
            break

    if not file_loaded:
        return config

    with config_file:
        try:
            config_json = json.load(config_file)
        except ValueError as e:
            logging.warning("Warning: Could not parse the configuration file.\n  %s", e)
            return config

        config.update(config_json)

    return config

def main():
    parser = argparse.ArgumentParser(prog=title, description=doc,
                                     epilog="E.g. %(prog)s --host 192.168.0.10 --name myremote KEY_VOLDOWN")
    parser.add_argument("--version", action="version",
                        version="%(prog)s {0}".format(version))
    parser.add_argument("-v", "--verbose", action="count",
                        help="increase output verbosity")
    parser.add_argument("-q", "--quiet", action="store_true",
                        help="suppress non-fatal output")
    parser.add_argument("-i", "--interactive", action="store_true",
                        help="interactive control")
    parser.add_argument("--host", help="TV hostname or IP address")
    parser.add_argument("--port", type=int, help="TV port number (TCP)")
    parser.add_argument("--method", help="Connection method (legacy or websocket)")
    parser.add_argument("--name", help="remote control name")
    parser.add_argument("--description", metavar="DESC",
                        help="remote control description")
    parser.add_argument("--id", help="remote control id")
    parser.add_argument("--timeout", type=float,
                        help="socket timeout in seconds (0 = no timeout)")
    parser.add_argument("key", nargs="*",
                        help="keys to be sent (e.g. KEY_VOLDOWN)")

    args = parser.parse_args()

    if args.quiet:
        log_level = logging.ERROR
    elif not args.verbose:
        log_level = logging.WARNING
    elif args.verbose == 1:
        log_level = logging.INFO
    else:
        log_level = logging.DEBUG

    logging.basicConfig(format="%(message)s", level=log_level)

    config = _read_config()
    config.update({k: v for k, v in vars(args).items() if v is not None})

    if not config["host"]:
        logging.error("Error: --host must be set")
        return

    try:
        with Remote(config) as remote:
            for key in args.key:
                remote.control(key)

            if args.interactive:
                logging.getLogger().setLevel(logging.ERROR)
                from . import interactive
                interactive.run(remote)
            elif len(args.key) == 0:
                logging.warning("Warning: No keys specified.")
    except exceptions.ConnectionClosed:
        logging.error("Error: Connection closed!")
    except exceptions.AccessDenied:
        logging.error("Error: Access denied!")
    except exceptions.UnknownMethod:
        logging.error("Error: Unknown method '{}'".format(config["method"]))
    except socket.timeout:
        logging.error("Error: Timed out!")
    except OSError as e:
        logging.error("Error: %s", e.strerror)os.pa

if __name__ == "__main__":
    main()


Habe reinstalled und die zweite Zeile jetzt gefunden und gelöscht, aber die "FileNotFoundError" finde ich nirgends.

docb

Hm, da sind einige Zeilen anders als bei meiner Datei. Bist du sicher, dass du Python2.7 hast?
Vermutlich hast du eine neuere Version. Ich schicke dir mal meine per PN. Habe aber keine Ahnung ob das dann mit den anderen Neuerungen zusammen funktioniert, bin ein völliger Python-Noob.
Viele Grüße
I love FHEM!

theophilou85

Hab es jetzt mit deiner versucht, immer noch nichts. Welchen "state" hat denn bei dir das Device und wie sieht dein FHEM-Code aus?

Zwecks Python: pi@raspberrypi:~ $ python -V
Python 2.7.9


docb

So schaut der List des TV aus:
Internals:
   DEF        MeineIP ws
   Host       MeineIP
   NAME       TV_Samsung
   NR         1141
   Port       ws
   STATE      Initialized
   TYPE       STV
   READINGS:
     2017-11-05 08:26:53   state           disconnected
Attributes:
   alias      Samsung
   group      Fernseher
   icon       it_television
   room       Multimedia
   sortby     1
   verbose    5

und so der List auf das WOL Device:
Internals:
   DEF        MeineMAC MeineIP
   IP         MeineIP
   MAC        MeineMAC
   MODE       BOTH
   NAME       TVSamsung_wol
   NR         1140
   REPEAT     000
   STATE      off
   TYPE       WOL
   READINGS:
     2017-11-23 14:53:20   active          off
     2017-11-23 14:45:45   isRunning       false
     2017-11-23 14:52:06   packet_via_EW   MeineMAC
     2017-11-23 14:52:06   packet_via_UDP  MeineIP
     2017-11-23 14:45:45   state           off
   TIMER:
     TVSamsung_wol_ping:
       HASH       TVSamsung_wol
       MODIFIER   ping
       NAME       TVSamsung_wol_ping
   helper:
Attributes:
   alias      Samsung (WOL)
   devStateIcon on:it_television@green off:it_television@red
   group      Fernseher
   icon       it_television
   room       Multimedia
   shutdownCmd set TV_Samsung POWER
   sortby     2
   webCmd     refresh:on:off


Python habe ich die Version 2.7.13.
Ich denke eher, dass du vielleicht eine neuere Versoin des samsungctl hast.
I love FHEM!

theophilou85

Sieht bei mir ganz gleich aus, aber klappt nicht :( Gibt es eine Möglichkeit herauszufinden welchen Port ich brauche, bzw. mit welchen TVs SamsungCTL kompatibel ist?

KölnSolar

das hast Du gemacht ? Fehlermeldungen ? Mal das Skript aus der Konsole gestartet ? Zugriff authorisiert ?
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

theophilou85

Ich fasse einmal zusammen, raspi 3:
1.) sudo apt-get update
2.) sudo apt-get upgrade
3.) wget https://bootstrap.pypa.io/get-pip.py
4.) sudo python get-pip.py
5.) sudo pip install websocket-client
6.) sudo pip install samsungctl
7.) sudo nano  /usr/local/lib/python2.7/dist-packages/samsungctl/__main__.py
     7.1: #directories.append(os.path.join(os.getenv("HOME"), ".config"))
     7.2: FileNotFounError findet er mit STRG+W nicht                                                 <-------------------------------------------!!!
8.) FileZilla: /opt/fhem/FHEM/70_STV.pm -->

package main;
use Blocking;
use strict;
use warnings;
use IO::Socket::INET;
use Sys::Hostname;
use MIME::Base64;
use DevIo;


9.) fhem.cfg define tv00 STV 192.168.0.203 ws
attr tv00 alias TV
attr tv00 group TV
attr tv00 room Devices

10.) Fhem Konsole: shutdown restart
11.) Fhem Konsole: set tv00 MUTE <------------- nichts passiert
Logfile: Traceback (most recent call last):
  File "/usr/local/bin/samsungctl", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/samsungctl/__main__.py", line 105, in main
    with Remote(config) as remote:
  File "/usr/local/lib/python2.7/dist-packages/samsungctl/remote.py", line 10, in __init__
    self.remote = RemoteWebsocket(config)
  File "/usr/local/lib/python2.7/dist-packages/samsungctl/remote_websocket.py", line 22, in __init__
    self._serialize_string(config["name"])), config["timeout"])
  File "/usr/local/lib/python2.7/dist-packages/websocket/_core.py", line 487, in create_connection
    websock.connect(url, **options)
  File "/usr/local/lib/python2.7/dist-packages/websocket/_core.py", line 211, in connect
    options.pop('socket', None))
  File "/usr/local/lib/python2.7/dist-packages/websocket/_http.py", line 71, in connect
    sock = _open_socket(addrinfo_list, options.sockopt, options.timeout)
  File "/usr/local/lib/python2.7/dist-packages/websocket/_http.py", line 125, in _open_socket
    raise err
socket.error: [Errno 111] Connection refused


Das mit dem "Aufruf ändern" bräuchte ich bitte ein Bisschen genauer erklärt. /usr/local/bin/samsungctl ist vorhanden.