Coder Social home page Coder Social logo

united-manufacturing-hub / united-manufacturing-hub Goto Github PK

View Code? Open in Web Editor NEW
254.0 254.0 37.0 230.17 MB

The Open-Source toolkit to build your own reliable and secure Industrial IoT platform.

Home Page: https://www.umh.app

License: Apache License 2.0

Dockerfile 2.22% Python 0.34% Shell 0.41% Go 96.27% Smarty 0.68% PowerShell 0.08%
iot mqtt oee

united-manufacturing-hub's Introduction

United Manufacturing Hub

License: Apache 2.0 Go Report Card Website FOSSA Status

The United Manufacturing Hub is an Open-Source Helm chart for Kubernetes, which combines state-of -the-art IT / OT tools & technologies and brings them into the hands of the engineer.

What can you do with it?

  1. Extract data from the shopfloor via Node-RED, sensorconnect and barcodereader
  2. Contextualize and standardize data using Node-RED and our pre-defined datamodel (which is compliant with multiple standards)
  3. Exchange and store data using MQTT, Kafka and TimescaleDB / PostgreSQL,
  4. Visualize data using Grafana and factoryinsight

Get started

License

All source code is distributed under the APACHE LICENSE, VERSION 2.0. See LICENSE for more information. All other components (e.g. trademarks, images, logos, documentation, publications), especially those in the /docs folder, are property of the respective owner.

About our current version 0.x.x.

Our current release, has been deployed and tested at a number of industrial sites worldwide and has proven to be stable in a variety of environments. While we have not yet reached a final version 1.0.0, this is typical for infrastructure projects that require extensive year-long testing and evaluation before a release. We are confident in the stability and reliability of our current release, which has been thoroughly tested over the past few years. As an open-source project, we welcome community involvement and feedback in the ongoing development and refinement of our software. We are committed to ensuring that our software is reliable and ready for deployment in industrial settings.

Development

To get started with development, please refer to our development guide.

Contact

UMH Systems GmbH

united-manufacturing-hub's People

Contributors

actions-user avatar amine-amaach avatar ayato77 avatar chrisproch avatar daruzero avatar dependabot[bot] avatar derektiffany avatar felixmhofmann avatar fossabot avatar github-actions[bot] avatar gornoka avatar jeremytheocharis avatar jonavo avatar kruegeralex avatar larswitte avatar mattjud avatar oarne97 avatar onurcankaraman avatar pascalwhoop avatar ricci2511 avatar robertfeldmannmck avatar scarjit avatar semantic-release-bot avatar sphingobium avatar vermuden avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

united-manufacturing-hub's Issues

Actual units are wrong if orders are wrongly scanned multiple times / overlapping

Actual units are wrong if orders are wrongly scanned multiple times / or scanned overlapping.

Expected Behavior

When orders are scanned multiple times it, it should only be stored once.

Current Behavior

Multiple orders are successfully filtered out. However, the current node-red flow still causes the count to go up everytime something is added (even if the order itself is filtered out).

image

Possible Solution

Change node-red script?

Steps to Reproduce

  1. Add multiple orders (start, end) and increase the count everytime as well

Depending on zoom level no shifts can show as no order

Expected Behavior

The state should be classified as no shift for all zoom level. The following is correct (when using last 7 days):
image

Current Behavior

It is classified as no order.
image

Additional information

Same issue happens with orders.
image
image

Write introduction into using the factorycube

Is your feature request related to a problem? Please describe.

People starting to work with our system are overwelmed by the choices they can do and how everything works together.

Describe the solution you'd like

We should write a training doc on how to start working with the system. Example components:

  • Explaination internal / external network at the factorycube
  • MQTT, datamodel and microservice architecture
  • nodered: MQTT_IN --> MAGIC --> MQTT_OUT

Automatically detect changeovers

Changeovers can for some assets automatically detected as the time between an order is started and the time that the machine is actually running. The same for the time when the machine was last running and the time when the order is finished.

Additionally, we can seperate both changeovers into "Preparation" and "Postprocessing"

Document all allowed MQTT messages

Is your feature request related to a problem? Please describe.
A new user does not know which MQTT messgaes exist and how he should format them, so that the rest of the system can process it.

Describe the solution you'd like

A documentation of all currently supported (and upcoming) messages with examples

Add existing documentation, configurations, dashboards for hardware

This should include:

  1. Getting Started with factorycube (how to work with it, there is some documentation existing)
  2. Existing node-red flows & example configurations (e.g. default flow, assembly analytics)
  3. Example technical cases & implementations (DCC Aachen Assembly Analytics, anonymized customers, etc.)

Stops and running times can disappear at the edge of the time range

NEW (see comment below)

Stops and running times can disappear at the edge of the time range.

ORIGINAL

Stop gets overrriden by running time

Expected Behavior

The machine has stopped for a longer period than specifided in the configuration. Therefore, an unknown stop should appear.

Current Behavior

There is no unknown stop showing.

stateTable
image

Dashboard
image

timestampAfterCurrentOne.Sub(timestampCurrent).Seconds() < 0 detected very often

The error message timestampAfterCurrentOne.Sub(timestampCurrent).Seconds() < 0 appears quite often. It is hard to debug.

Expected Behavior

Normally there should not be any errors while executing.

Current Behavior

The error message appears quite frequently and it is hard to debug and to describe it. At least add additional information.

As a user, I would like to adjust incorrect or incomplete entries in the dashboard afterwards

Is your feature request related to a problem? Please describe.
I am frustrated when the system transmits potentially erroneous data or data is created by incorrect use. This data is then no longer easy to adjust for me as the end user.

Describe the solution you'd like
I would like to have a dashboard where I can adjust historical data in the database (e.g. machine states, produced quantity, shifts or quality data etc.). I would like to do this via an easy to use user interface and without much technical know how. At the same time I don't want the data to be ruined by a single person.

new api: getQuality and getQualityRate

With the help of this apis I would like to be able to represent the share of the good production in the total production.

The apis differ in that getQuality calculates this KPI on a daily basis for a long-term view and getQualityRate on a minute basis in order to be able to react to rapid changes in production.

Directly adjacent shifts are not reliably stored

Provide a general summary of the issue in the Title above

Expected Behavior

Layers that are directly adjacent to each other should still be saved (with a few seconds overlap if necessary).

Current Behavior

In some cases, layers that overlap minimally are not saved.
2021-01-22_17h19_14
2021-01-22_17h18_54

Add sub-states to CalculateAverageStateTime

Is your feature request related to a problem? Please describe.
Currently CalculateAverageStateTime does only calculate for a specific state.

Describe the solution you'd like
If you specify a overarching state category, e.g. 10000 or 20000 I want all sub-states included as well

Describe alternatives you've considered

Additional context

As an x86 User i want to use the barcodereader

Is your feature request related to a problem? Please describe.
As an user of a x86 edge PC i want to be able to use the barcodereader

Describe the solution you'd like
Port barcodereader from ARM to x86

Add example how to connect PowerBI to our API

Is your feature request related to a problem? Please describe.
We did multiple projects where we established a direct link from PowerBI to our API.

Describe the solution you'd like
Let's give that to the community by providing an example.

As a user, I want to be able to report factoryinsight realtime machine conditions via the dashboard

Is your feature request related to a problem? Please describe.
If a machine operator is standing at the machine, he should be able to communicate error reasons and other machine information to the system that otherwise cannot be recorded via the machine. For example: break, manually detected quality defects, etc.

Describe the solution you'd like
I would like to have the possibility to create a dashboard in Grafana, which can be used to add data to the system with the help of button lists and possibly free input fields.

Describe alternatives you've considered
Using an external dashboard Nodered which connected to the local MQTT broker. Disadvantage: The tablet must be in the same network as the factorycube, which can lead to problems with a firewall or wifi.

Additional context
Challenge: The machine state is determined on the activity of the machine and annomalities but the machine operator only wants to communicate the finite state. How do I prevent him from entering incorrect data, such as pause while the machines are running. Or selecting too many badly produced pieces.

States change depending on the zoom level during time ranges longer than a day

specifyUnknownStopsWithFollowingStopReason does not work when states get split up by processStatesOptimized

Expected Behavior

States should stay the same independent of the selected time range.

Current Behavior

States effected by specifyUnknownStopsWithFollowingStopReason will change depending on the selected time range.

Zoom level 1:
image

Zoom level 2:
image

Possible Solution

This is likely caused when processStatesOptimized splits up states for easier processing. Then specifyUnknownStopsWithFollowingStopReason can not fulfil its function properly.

Steps to Reproduce

  1. Find a unspecified stop that gets specified by specifyUnknownStopsWithFollowingStopReason
  2. change the time range to over 1 day, e.g. multiple days, so that the time of the beginning of that only the time (not date) of is during the unspecified stop

I would like to use the system more easily in continuous production

Is your feature request related to a problem? Please describe.
Currently, the system is based on the size count to describe the production of an asset. This is designed as a discrete quantity. As a quantity above there is the "discrete product" here an equivalent for the continuous production is missing. Specifically, I would like to measure the good production on a weaving machine and subsequently be able to mark a part as bad production.

Describe the solution you'd like
Specifically, I would like to measure the good production on a weaving machine and subsequently be able to mark a part as bad production.

Function should only return structs

Is your feature request related to a problem? Please describe.
It does not impact user experience, but it results in an inconsistent programming style

Describe the solution you'd like
Consistent programming style according to the target architecture specified in main.go

Fix potential security issue in mqtt-to-postgresql

storeIntoTable has a possible SQL injection (currently not in it, but potentially for the future)

        // WARNING SQL INJECTION POSSIBLE
	sqlStatement := `
		INSERT INTO ` + tableName + `(timestamp, asset_id, ` + columnName + `) 
		VALUES (to_timestamp($1 / 1000.0),$2,$3) 
		ON CONFLICT DO NOTHING;`

Extend /count with the possibility of scrap

I would like to have the possibility to inform the system with the help of a single message that a product has been produced but is to be classified as a bad product.

However, it should still be possible to send a message to count without the scrap-key whenever a product is to be classified as a good product or no final statement about its quality can be made yet.

Idea:
{
timestamp : 1234,
count : 2,
scrap : 2
}

Overwrite data via MQTT (mqtt-to-postgresql)

In order to implement the higher-level EPIC, the following data must be able to be changed via MQTT in this work package:

  • machine states (states),
  • shifts,
  • produced pieces (count) (may require extension for scrap)

Rework of automation pipeline

  1. Automated building when pushing a commit to "staging" branch. We can then verify the functionality on our server.
  2. Remove todo-action as it is not working

Create user-interface to change data (Grafana frontend plugin)

To implement the parent EPIC, we need a user-interface in Grafana to add and modify data.

Graphical elements

Mockup: https://xd.adobe.com/view/9604a01e-fa09-4cbc-9576-ab9b53ae15c8-c357/screen/d36faf85-f3fe-4543-9368-d59307420727

Use standard grafana design elements for the UI: https://developers.grafana.com/ui/latest/index.html?path=/story/docs-overview-intro--page

Overwrite machine states list widget

image

User Story 1: I want to remove unrealistic long machine running times in the past 30 days

  1. I select the desired location
  2. I select the desired asset
  3. I select the past 30 days in the Grafana time selector widget on the top right
  4. I select 6h in the 'show elements longer than selected timerange' dropdown
  5. I search for rows with machine state 'machine running' and select 'unknown stop' for each unrealistic shift / row and press 'adjust state'.
  6. I confirm the change for each row
  7. I do it until I am satisfied with the result

User Story 2: (story currently not in scope) I want to overwrite several machine states at once

  1. I select the desired location
  2. I select the desired asset
  3. I select the past 2 Day in the Grafana time selector widget on the top right
  4. I select all in the 'show elements longer than selected timerange' dropdown
  5. I select in the table "select all"
  6. I click in the dropdown of the entire table the new desired state for the entire period and confirm my input
  7. I do it until I am satisfied with the result

Overwrite shift list widget

image

User Story 1: I want to adjust a shift, that ended earlier than expected

  1. I select the rough time range of that shift in the Grafana time selector widget (e.g. past 7 days)
  2. I see now all shift in that time range
  3. I remove the shift that ended earlier by pressing on the remove icon in that row and confirming
  4. I enter the time range at the bottom / 'add new shift' using a date selector and press add button and confirm

User Story 2: I want to remove a shift on the weekend

  1. I select the rough time range of that shift in the Grafana time selector widget (e.g. past 7 days)
  2. I see now all shift in that time range
  3. I remove the shift that I want to be removed

Scrap entire timerange widget

image

User Story 1: I want to mark the products of the past 3h as scrap / bad quality

  1. I select the rough time range of that shift in the Grafana time selector widget (e.g. past 7 days)
  2. I see now the produced pieces, scrapped pieces, etc. in other widgets
  3. I finetune the time range until I am satisfied with the amount of produced pieces
  4. I press 'scrap everything in current time range' and confirm

MQTT messages

MQTT messages for "Overwrite machine states list widget" User Story 1

Topic: ia/<customerID>/<location>/<AssetID>/removeState

With the help of this topic a state can be deleted from a machine with a certain timestamp.

scrapState in the JSON is a string.

{
    "timestamp_ms": 1588879689394
}

Topic: ia/<customerID>/<location>/<AssetID>/state

A message is sent here each time the asset changes status. Subsequent changes are not possible. Different statuses can also be process steps, such as "setup", "post-processing", etc. You can find a list of all supported states here

state in the JSON is a integer according to this datamodel

Example for /state

{
    "timestamp_ms": 1588879689394, 
    "state": 10000
}

MQTT messages for "Overwrite shift list widget" User Story 1

Topic: ia/<customerID>/<location>/<AssetID>/removeShift

With the help of this topic a Shift can be deleted from a machine with a certain timestamps.

scrapShift in the JSON is a string.

{
    "timestamp_ms": 1588879689394, 
    "timestamp_ms_end": 1588879689395
}

MQTT messages for "Overwrite shift list widget" User Story 2

Topic: ia/<customerID>/<location>/<AssetID>/removeShift

With the help of this topic a Shift can be deleted from a machine with a certain timestamps.

scrapShift in the JSON is a string.

{
    "timestamp_ms": 1588879689394, 
    "timestamp_ms_end": 1588879689395
}

Topic: ia/<customerID>/<location>/<AssetID>/addShift

A message is sent here each time a new shift is started.

timestamp_ms_end in the JSON is a integer representing a UNIX timestamp in milliseconds.

Example for /addShift

{
    "timestamp_ms": 1588879689394, 
    "timestamp_ms_end": 1588879689395
}

MQTT messages for "Scrap entire timerange widget" User Story 1

Topic: ia/<customerID>/<location>/<AssetID>/scrapCount

Here a message is sent every time products should be marked as scrap. It works as follows:
A message with scrap and timestamp_ms is sent. It starts with the count that is directly before timestamp_ms. It is now iterated step by step back in time and step by step the existing counts are set to scrap until a total of scrap products have been scraped.

Important notes:

  • You can specify maximum of 24h to be scrapped to avoid accidents
  • (NOT IMPLEMENTED YET) If counts does not equal scrap, e.g. the count is 5 but only 2 more need to be scrapped, it will scrap exactly 2. Currently it would ignore these 2. see also #125
  • (NOT IMPLEMENTED YET) If no counts are available for this asset, but uniqueProducts are available, they can also be marked as scrap. //TODO

scrap in the JSON is an integer.

Example for /scrapCount

{
    "timestamp_ms": 1588879689394, 
    "scrap": 1
}

open questions

  • Where do I get the available machine states which I can select in the dropdown menu?

new topic /scrapCount which marks historical counts as bad product

Idea:
Scrap marked the last counts incl. the timestamp as bad production (in time back)
image

You should not be able to send more scraps than counts
Scrap can also be sent with the same timestamp as the last count
If no counts are available for this asset, but uniqueProducts are available, they can also be marked as scrap.

No shifts are classified as unknown stops although no shift is running

No shifts are classified as unknown stops although no shift is running

Expected Behavior

Unknown Stops shoul be classified as noshift while no shift is running

Current Behavior

2021-01-20_09h56_24

Possible Solution

Not obligatory, but suggest a fix/reason for the bug,

Steps to Reproduce

Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include code to reproduce, if relevant. Issues in factoryinsight or mqtt-to-postgresql are usually really good reproducable with the exact request, so please include it here as well.

The bug only occurs on one machine, on other machines unknown stops at no shift are correctly classified as no shift.
2021-01-20_10h18_42
2021-01-20_10h17_52

Context (Environment)

How has this issue affected you? What are you trying to accomplish?
Providing context helps us come up with a solution that is most useful in the real world

Provide a general summary of the issue in the Title above

Detailed Description

Provide a detailed description of the change or addition you are proposing

Possible Implementation

Not obligatory, but suggest an idea for implementing addition or change

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.