German - Brauche Starthilfe für mein Projekt


#1

Hallo zusammen,

habe mich mit snips etwas auseinandergesetzt und die Hard- und Software soweit am laufen, gemäß den tutorials auf snips.ai. Jetzt müsste ich ActionCode schreiben - da hapert es aber gewaltig!

Mein Ziel ist folgendes:
Ich habe eine Haussteuerung, bei der ich via http-Befehle die Relais ein und ausschalten kann - auch dimmen wäre möglich.

So ein Befehl sieht z.B. wie folgt aus (kann ich so in den Browser tippen und das Relais schaltet um):
http://user:password@serverIP:port/dev/sps/io/VI1/Pulse

Ich muss also meine intens anlegen und mittels AcionCode diese Befehle durchs LAN an den Server der Haussteuerung versenden.

Ich habe nur leider nur Ahnung von phyton und JSON …
habe nur Grundkenntnisse in C und Javascript…

Kann mir vielleicht jemand helfen damit ich hier weiter komme?
Das wäre super :slight_smile:

Beste Grüße
Rouven


#2

Ok, bitte mehr Hintergrund wissen, was hast du und mit was die ai und wie hast du deine relais vorher / bis jetzt gesteuert


#3

ganz spontan und nicht getestet, als action dürfte es aber nicht gehen weil da keine eigenen imports gehen (denke ich) - müsste also in github sein:

from hermes_python.hermes import Hermes
import requests

def subscribe_intent_callback(hermes, intentMessage):
    requests.get(' [http://user:password@serverIP](http://user:password@serverip/):port/dev/sps/io/VI1/Pulse')

if __name__ == "__main__":
    with Hermes("localhost:1883") as h:
            h.subscribe_intents(subscribe_intent_callback).start()

#4

Hey @Rouven,

ich denke auch, dass du mehr über dein Projekt erzählen solltest. Hier gibt es zum Beispiel Leute, die sich gut mit HomeAssistant, openHAB oder anderen Systemen auskennen. Hausautomatisierung ist ein weites Feld…

Und wenn du in Englisch schreibst, erreichst du sogar noch mehr Leute. :slight_smile:

Gruß
freddy


#5

Hallo an alle,

danke schon mal für eure Rückmeldungen, das freut mich und bringt wieder Lust weiter zu machen…

Ich habe mich an das Tutorial von snips gehalten und habe die empfohlene Hardware gekauft.
PI3B+
Respeaker 2Mic PI HAT
Lautsprecher für den PI HAT

Habe die snips-software auf den PI installiert und mit SAM auch mal die APPs (Wetter und Taschenrechner) aus der Konsole runtergeladen und mit Sprachbefehlen erfolgreich ausprobiert.

Ich habe eine fertig installierte Loxone Hausteuerung im Haus verbaut und möchte nun OFFLINE per Sprachbefehle meine Leuchten und Rollos etc. schalten.

Wie bereits geschrieben, kann ich den http-Befehl via Internetbrowser absenden und mein Loxone-Server schaltet die Relais. Ich habe natürlich entsprechende Virtuelle-Inputs (VI1, VI2, … ) auf dem Loxone-Server angelegt damit dieser die http-Befehle umsetzen kann.

Ich möchte/brauche also keine weiteren Systeme im Haus wie z.B. openHAB.
Ich brauche nur ein Offline-System (->snips) das mir diese http-Befehle zum Loxone Server sendet.

Jetzt brauche ich nur mal das Grundgerüst um das Relais zu schalten und das Drum-Herum, also die Intents und Intentsvariationen mache ich dann als Fleißarbeit.

So habe ich angefangen:
ich habe in der Console eine neue APP erstellt.
Ich habe einen Intent getActor meiner APP hinzugefügt.
Darin hab ich einen custom Slot Actor_type hinzugefügt.
Das Training Example heißt u.a. z.B. Schalte das Licht im Büro ein.
Hier setze ich den Slot Actor_type auf das Wort Licht.

Damit möchte ich die Aktoren filtern: Licht, Rolladen, etc.

Jetzt mache ich das ganze noch für:
getCommand (Befehl: Schalte, Dimme, etc.)
getDimValue (Dimmwert: 10 Prozent, 50 Prozent, etc.)
getRoomName (Raumname: Wohnzimmer, Büro, etc.)
getDirection (Richtung: Auf, Ab, Hoch, Runter, etc.)

jeweils immer nur einen Slot, da nur ein Wert gefiltert werden soll.

Dann wechsel ich in ACTIONS und gehe dort auf Code Snippets.
Und da steh ich nun aufm Schlauch und benötige Hilfe :wink:
Habe ich bis dahin alles richtig gemacht?

Ich hoffe das beschreibt es jetzt besser :slight_smile:


#6

I have the same kind of worries …
I send a python command to key words in a Lifedomus system to control the lights and shutters in damage with a typical command
r = requests.post (“http://192.168.1.212:8080/UniversalListen?trame=MovementOn”)
and in python for which I have little experience I have to put a # in front of my r = requests.post so that the answer given by Snips is pronounced

#!/usr/bin/python
# -- coding: utf-8 --

## Made by JLR - 2019 ##

from __future__ import unicode_literals

import datetime
import json

import paho.mqtt.client as mqtt
import paho.mqtt.publish as mqttPublish
import requests
import time

import logging

lightsTurnOff         = 'hermes/intent/richardpub:lightsTurnOff'
lightsTurnOn         = 'hermes/intent/richardpub:lightsTurnOn'
openCoversBlinds    = 'hermes/intent/richardpub:openCoversBlinds'
closeCoversBlinds    = 'hermes/intent/richardpub:closeCoversBlinds'

fromtimestamp = datetime.datetime.fromtimestamp

# MQTT client to connect to the bus
mqtt_client = mqtt.Client()
HOST = "192.168.1.16"
PORT = 1883



# Subscribe to the important messages
def on_connect(client, userdata, flags, rc):
    mqtt_client.subscribe(lightsTurnOn)
    mqtt_client.subscribe(lightsTurnOff)
    mqtt_client.subscribe(openCoversBlinds)
    mqtt_client.subscribe(closeCoversBlinds)
    
    mqttPublish.single('hermes/feedback/sound/toggleOn', payload=json.dumps({'siteId': 'default'}), hostname='192.168.1.16', port=1883)

# Process a message as it arrives
def on_message(client, userdata, message):
    intent = message.topic
    if intent == lightsTurnOn:
        response = ("la lumiere est ouverte")
		#r = requests.post("http://192.168.1.212:8080/UniversalListen?trame=mouvementOn")
		
    elif intent == lightsTurnOff:
        response = ("la lumiere est fermer")
		#r = requests.post("http://192.168.1.212:8080/UniversalListen?trame=mouvementOff")

    elif intent == openCoversBlinds:
        response = ("le volet est ouvert")
		#r = requests.post("http://192.168.1.212:8080/UniversalListen?trame=mouvementOn")

    elif intent == closeCoversBlinds:
        response = ("le volet est fermer")
		#r = requests.post("http://192.168.1.212:8080/UniversalListen?trame=mouvementOff")
		

      
    
    session_id = parse_session_id(message)
    say(session_id, response)



def parse_slots(message):
    '''
    We extract the slots as a dict
    '''
    data = json.loads(message.payload)
    return {slot['slotName']: slot['rawValue'] for slot in data['slots']}


def parse_session_id(message): 
    '''
    Extract the session id from the message
    '''
    data = json.loads(message.payload)
    return data['sessionId']
  
  
def say(session_id, text):
    '''
    Print the output to the console and to the TTS engine
    '''
    print(text)
    mqtt_client.publish('hermes/dialogueManager/endSession', json.dumps({'text': text, "sessionId" : session_id}))



if __name__ == '__main__':
    mqtt_client.on_connect = on_connect
    mqtt_client.on_message = on_message
    mqtt_client.connect(HOST, PORT)
    mqtt_client.loop_forever()

It works like this but I do not understand why I need this # in front
r = requests.post (“http://192.168.1.212:8080/UniversalListen?trame=MovementOn”)
In python I can not find how to do 2 different actions one behind the other when a condition is met ???
What I have lauded


#7

# is a comment - it should not be executing the http request?

python blocks are just by indentation, when you want an “if” for multiple statements, just have the same amount of leading spaces/tabs (like in your example without the #)


#8

Ok i think so, but explain me why it’s ok with #
And not ok without #


#9

I have trying all the indentation and
I came to this solution by tests and it’s like this that I find this solution is ok, but I don’t understand…


#10

Sorry for my English


#11

Hallo ich bin es wieder… habe wieder etwas Zeit für mein Loxone-Snips-Projekt.

Bisschen doof wenn sich jemand einklinkt und dann “mein” Anliegen dadurch in den Hintergrund gerät.
Jetzt ist viel Zeit vergangen und keiner hat mehr auf meinen letzten Beitrag geantwortet.

Ich probiere mich mal an Philipps letzten Tipp…

Gruß Rouven